View Full Version : [JAVA] gestione JScrollPane
foxmolder5
15-09-2004, 12:26
ho una tab ed al suo interno devo inserire un JScrollPane ed in basso alla tab un pulsante che tramite actionListener mi mostri all'interno del JScrollPane il contenuto di una matrice che dovrò disporre in due colonne (prima colonna con una descrizione del numero che sarà presente nella seconda colonna).mi sai dare un mano?
ho creato il JScrollPane con il bottone ma non riesco a posizionarlo come quasi tutta la tab e con in fondo il pulsante e poi non so cosa inserire nell'actionListener per permettere al Jscroll di visualizzare tutte le info della matrice.grazie
foxmolder5
15-09-2004, 13:11
il bottone può essere messo sia sopra che sotto e all'interno del JScrollPanel vorrei avere una tabella con due colonne (perchè la sorgente dei dati è una matrice che ha due colonne e dovrei copiarle quasi pari pari).quando apro il tab la tabella può essere vuota ed inoltre il JScrollPane deve poter supportare lo scroll laterale,se i dati sono tanti
Questo è il componente col pulsante e la tabella. Devi implementare opportunamente il metodo getData in modo che restituisca un array bidimensionale di Object che rapresentano gli oggetti della tabella.
class MyTablePanel extends JPanel implements ActionListener{
JButton pulsante;
JScrollPane scroll;
//Nomi delle colonne
String[] colNames = {"Prima colonna", "Seconda colonna"};
//Dati della tabella
Object[][] data;
public MyTablePanel(){
setLayout(new BorderLayout(5, 5));
pulsante = new JButton("pulsante");
pulsante.addActionListener(this);
//Pannello che contiene il pulsante
JPanel buttonPanel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(5, 5, 5, 5);
buttonPanel.add(pulsante, c);
add(buttonPanel, "South");
JTable table = new JTable(new Object[5][2], colNames);
addTablePanel(table);
}
private void addTablePanel(JTable table){
if(scroll != null)
remove(scroll);
//Imposto la larhezza della colonna 0
table.getColumnModel().getColumn(0).setPreferredWidth(35);
//Imposto la larhezza della colonna 0
table.getColumnModel().getColumn(1).setPreferredWidth(200);
JPanel tabPanel = new JPanel(new BorderLayout());
tabPanel.add(table, "Center");
tabPanel.add(table.getTableHeader(), BorderLayout.PAGE_START);
scroll = new JScrollPane(tabPanel);
add(scroll, "Center");
validate();
}
public void actionPerformed(ActionEvent e){
addTablePanel(new JTable(getData(), colNames));
}
Object[][] getData(){
Object[][] d = {{"uno", "due"},
{"tre", "quattro"},
{"cinque", "sei"},
{"sette", "otto"},
{"nove", "dieci"},
{"undici", "dodici"}};
return d;
}
}
foxmolder5
15-09-2004, 19:54
non riesco a far funzionare il codice.se lo lascio come classe a parte il programma mi parte ma non mi compare proprio la finestra( la classe l'ho richiamata inserendo nella classe della finestra principale "myTablePanel vai = new myTablePanel". se invece provo a toglierlo dalla classe ed inserirlo direttamente nella classe della finestra principale mi vengono fuori molti errori (ho cambiato i nomi e li ho scritti giusti rispettando i nomi degli altri componenti che avevo messo).ma per esempio una domanda, quando scrivi
add(buttonPanel, "South");
non riesco a capire a cosa aggiungi il pannello del bottone.ho provato a fare
c.add(buttonPanel, "South"); ma mi da errore e se lo lascio com'è non esce proprio nulla.
Il componente va agiunto come classe cosi:
myTablePanel vai = new myTablePanel();
e poi l'istuzione per aggiunerlo dipende se lo aggiungi ad un JFrame:
getConentPane().add(vai);
o ad un altro JPanel:
add(vai);
foxmolder5
16-09-2004, 10:04
grazie.sembra funzionare.un'altra domanda :nella tab della finestra non appare nessun nome,dove devo inserire il nome per dare un titolo al tab (per farlo apparire sulla "linghetta")?
foxmolder5
16-09-2004, 10:16
ah mi ero dimenticato : nel programma ho l'esigente di inserire dati all'interno della matrice d. ti spiego,sto facendo un prog per gestione del conto bancario e la finestra che hai fatto sarebbe la finestra dell'estratto conto in cui devo mostrare le operazioni che sono state fatte durante la sessione.infatti apro il prog,si avvia la sezione e faccio delle operazioni che saranno memorizzate nella matrice Object e poi se voglio vedo le operazioni tramite la finestra.ho provato a spostare Object[][] d = {{"uno", "due"},
{"tre", "quattro"},
{"cinque", "sei"},
{"sette", "otto"},
{"nove", "dieci"},
{"undici", "dodici"}};
però poi mi da un errore in esecuzione quando clicco sul pulsante.poi creerò un metodo che mi modificare ogni volta l'istanza d ma il prob è che non so poi come inviare i dati allo scroll quando si usa il metodo get() .
Non so come è implementata la logica della tua applicazione. Ciò che in genere si fa in queste situazioni è passare al costruttore del pannello che che ti ho implementato un riferimento all'oggetto che mantiene la storia delle operazioni; tale oggetto deve offrire un metodo pubblico tipo:
Object[][] getXXXX()
che restituisce la matrice delle operazioni che poi il pannello si occuperà di visdualizzare nella tabella. Ti consilio di consultare l'ampio tutorial sulla costruzione di interfacce grafiche conm swin che e presnete sul sito della sun:
http://java.sun.com/docs/books/tutorial/uiswing/index.html
foxmolder5
16-09-2004, 15:58
tu nel metodo getData hai istanziato la matrice inserendovi quelle parole e poi hai messo la stessa in return per darla in pasto allo scroller. io quindi avevo pensato di eliminare l'instanziazione della matrice :
Object[][] getData(){
return d;
}
l'instanziazione la farò con un opportuno metodo set che la prima volta crea una matrice MxM e poi le volte successive vi inserisce i dati. per non aver errore dalla modifica fatta sopra ho cambiato :
Object[][] data ----- in ----> Object[][] d
così da non aver errore nel metodo get . il problema è che poi mi viene dato errore in esecuzione per la visualizzazione.ho fatto qualche errore?
ti dico che poi oltre al metodo Object[][] getData() creeròl anche il metodo Object[][] setData() (di cui ho parlato prima).
Il campo
Object[][] data;
è superfluo.
L'errore è dovuto al fatto che il campo data non è istanziato e resta null. Scrivi quindi:
Object[][] data = new Object[10][2];
per esempio per instanziarlo ed avere una matrice inche non implementi opportunamente il metodo che deve fornirti tale matrice.
foxmolder5
16-09-2004, 20:51
quindi :
Object[][] data ------ in ---> Object[][] data = new Object[10][2]
JTable table = new JTable(new Object[5][2], colNames);
||
||
in
||
||
V
JTable table = new JTable(data, colNames);
poi il metodo getData si cambia in :
Object[][] getData(){
return data;
}
c'è qualche errore?
No,
ma comunque è tutto provvisorio perche come ti ho detto dovrai passare al costruttore di MyTablePanel un oggetto y di una classe che ha un metodo
Object[][] xxxx();
per cui la tabella la costruirai con
new JTable(y.xxxx(), colNames);
nel gestore dell'evento del pulsante, mentre la prima volta, quando i dati ancora non ci sono, la costruisci con
new JTable(new Object[2][10], colNames);
e a questo punto il campo data di MyTablePanel non ha piu motivo di esserci.
foxmolder5
17-09-2004, 00:12
risolto tutto.il programma funziona e va bene! ora devo finirne 1 altro che avevo lasciato in sospeso.devo vedere se rifarlo da capo oppure cercare di migliorare quello che ho.è difficile quest'altro.
foxmolder5
19-09-2004, 22:08
una domanda.nel componente che mi hai fatto ho visto che poi quando lo vado ad implementare funziona senza problemi,però nella linguetta della tab non appare nessun titolo.dove lo posso inserire il il titolo della tab all'interno del codice che mi hai dato?
Il pannello che ti ho implementato è semplicemente un componente e può essere aggiunto ovunque, non è correlato al JTabbedPane. Per avere il titolo sulla scheda devi utilizzare il metodo
add(String title, Component component)
di JTabbedPane, aiungendo come component il mio pannello.
foxmolder5
20-09-2004, 09:50
ho inserito:
Container pannello = new Container();
pannello.add("estratto",tabPanel);
ma qualsiasi cosa inserisca al posto di "tabPanel" non vi è il risultato voluto,o non si vede la griglia o non si vede la finestra, o altro.ho messo un post nella sezione ci puoi dare un'occhiata x favore che non so come fare?!?! oggi è l'ultimo giorno che faccio domande,poi nn rompo + :-)
Non devi aggiungere ad un container generico, ma ad un tabbedpane:
JTabbedPane pane = new JTabbedPane();
pane.add("estratto",tabPanel);
PS: perche non ti dai una lettura ai tutorial della sun e alla documentazione delle classi swing? Il 90% dei dubbi che vengono si risolvono semplicemnte leggendo la documentazione delle classi e gli esempi riportati:
http://java.sun.com/docs/books/tutorial/uiswing/index.html
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.