GridBagLayout non riempie tutto lo spazio
-
21-12-2019 - |
Domanda
Ho un pannello che viene utilizzato come parte del layout della carta.Il pannello utilizza GridBagLayout
.Aggiungo due componenti: JTextArea
con riempimento impostato su ENTRAMBI e JTextField
con riempimento impostato su orizzontale.Stanno occupando solo lo spazio orizzontale.
// Chat card setup
JPanel chatCard = new JPanel(new GridBagLayout());
gc = new GridBagConstraints();
gc.gridx = 0;
gc.gridy = 0;
gc.fill = GridBagConstraints.BOTH;
gc.weightx = 2;
chatArea = new JTextArea();
chatCard.add(chatArea,gc);
gc.gridx = 0;
gc.gridy = 1;
gc.fill = GridBagConstraints.HORIZONTAL;
gc.anchor = GridBagConstraints.PAGE_END;
gc.weightx = 2;
JTextField msgField = new JTextField();
msgField.setActionCommand("SendText");
msgField.addActionListener(listener);
chatCard.add(msgField, gc);
Attualmente sembra così
Soluzione
Prova con gc.weighty
...
gc.weightx = 2;
gc.weighty=1;
chatArea = new JTextArea();
...
JScrollPane scrollPane=new JScrollPane(chatArea);
chatCard.add(scrollPane,gc);
...
...
gc.weightx = 2;
gc.weighty=0;
JTextField msgField = new JTextField();
...
Aggiungere JTextArea
In JScrollPane
altrimenti otterrai un risultato inaspettato quando le righe saranno più grandi della sua altezza.
utilizzo gc.insets=new Insets(5, 5, 5, 5);
se vuoi un po' di spazio in alto/sinistra/basso/destra.
Istantanea:
Altri suggerimenti
@Braj ha la risposta per GridBagLayout: usa il vincolo pesante e 1+ alla sua risposta, ma penso che la tua configurazione sarebbe molto migliore se utilizzassi un BorderLayout, posizionassi la tua JTextArea in un JScrollPane, posizionassi JScrollPane BorderLayout. CENTER e JTextField BorderLayout.SOUTH (noto anche come BorderLayout.PAGE_END).
JPanel chatCard = new JPanel(new BorderLayout(5, 5));
int rows = 20;
int cols = 40;
JTextArea chatArea = new JTextArea(rows, cols);
chatCard.add(new JScrollPane(chatArea), BorderLayout.CENTER);
JTextField msgField = new JTextField(cols);
msgField.setActionCommand("SendText");
// msgField.addActionListener(listener);
chatCard.add(msgField, BorderLayout.PAGE_END);