2009-08-04 2 views
5

Ho tre JLabel e tre JTextAreas. Li ho in borderlayout, al centro, ma voglio che ognuno di loro in una linea diversa, che non sta accadendo e i primi dieci risultati di ricerca in Google per interruzione di riga Java non risolvono il problema. Come posso fare una semplice interruzione di linea?<br>? N? un'interruzione di riga in java

+0

si può mostrare come si stanno aggiungendo i componenti ai tuoi JPanel? – akf

+0

mainPanel.add (aLabel); mainPanel.add (aScroller); mainPanel.add (bLabel); mainPanel.add (bScroller); mainPanel.add (cLabel); mainPanel.add (cScroller); –

+0

Ha funzionato in questo modo: mainPanel.setLayout (nuovo BoxLayout (mainPanel, BoxLayout.PAGE_AXIS)); –

risposta

7

Se si tratta di un'applicazione Swing, è necessario utilizzare layout manager per posizionare i campi nel contenitore.

2

L'interruzione di linea non aiuta a posizionare oggetti Swing; è necessario posizionare un layout su un centro JPanel. Cioè, il centro del layout del tuo bordo dovrebbe essere un singolo oggetto Swing, un JPanel, e dovresti impostarlo su uno stile che ti permetta di impilare ogni widget. GridLayout (6,1) può farlo.

1

provare a utilizzare un GridLayout per cominciare:

panel.setLayout(new GridLayout(0,2)); 
// the order of added components is important 
panel.add(labelA); 
panel.add(textAreaA); 
panel.add(labelB); 
panel.add(textAreaB); 
... 

non sembra troppo bella, ma è una buona partenza.

Se non si imposta un LayoutManager su un nuovo pannello, verrà utilizzato un FlowLayout che si comporta in qualche modo come il layout HTML. Ma non esiste una interruzione di linea prevista in un FlowLayout. Metterà solo componente dopo componente fino a raggiungere la fine dello spazio disponibile e quindi avviare una nuova riga.
Se si desidera controllare i layout, non utilizzare FlowLayout.

gestori di layout che si potrebbe desiderare di conoscere sono:

  • BorderLayout - molto buono se si desidera che il contenuto ridimensionabile
  • GridLayout - semplice uguale larghezza e l'altezza della griglia
  • null - consente di utilizzare setBounds su ogni componente per ottenere posizioni assolute

Ce ne sono di più, ma questi tre dovrebbero consentire il layout del 95% dei pannelli.

2

È possibile utilizzare i gestori di layout come GridLayout o GridBagLayout. Anche se quest'ultimo è consigliato solo per il codice generato dai generatori di GUI, lo preferisco perché mi dà la massima flessibilità.

JPanel panel = new JPanel(); 
GridBagLayout layout = new GridBagLayout(); 
panel.setLayout(layout); 
layout.add(label1, new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); 
layout.add(area1, new GridBagConstraints(1, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); 
layout.add(label2, new GridBagConstraints(0, 1, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); 
layout.add(area2, new GridBagConstraints(1, 1, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); 
layout.add(label3, new GridBagConstraints(0, 2, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); 
layout.add(area3, new GridBagConstraints(1, 2, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); 
panel.add(label1); 
panel.add(label2); 
panel.add(label3); 
panel.add(area1); 
panel.add(area2); 
panel.add(area3); 

Naturalmente questo sembra brutto ma dovrebbe iniziare.

Si può anche abusare di un BorderLayout:

JPanel panel = new JPanel(new BorderLayout()); 
JPanel topRow = new JPanel(); 
panel.add(topRow, BorderLayout.PAGE_START); 
topRow.add(label1); 
topRow.add(area1); 
JPanel middleRowBox = new JPanel(new BorderLayout()); 
panel.add(middleRowBox, BorderLayout.CENTER); 
JPanel middleRow = new JPanel(); 
middleRowBox.add(middleRow, BorderLayout.PAGE_START); 
middleRow.add(label2); 
middleRow.add(area2); 
JPanel bottomRowBox = new JPanel(); 
middleRowBox.add(bottomRowBox, BorderLayout.CENTER); 
JPanel bottomRow = new JPanel(); 
bottomRowBox.add(bottomRow, BorderLayout.PAGE_START); 
bottomRow.add(label3); 
bottomRow.add(area3); 
bottomRowBix.add(new JPanel(), BorderLayout.CENTER); 
+1

Dopo aver costruito un sacco di componenti dell'interfaccia utente, utilizzo solo GridBagLayout - sì, è un po 'più di lavoro, ma puoi essere garantito se fai le cose per bene che la tua visualizzazione verrà adattata in modo appropriato. – aperkins

+0

Dopo aver costruito un sacco di componenti dell'interfaccia utente, non usiamo più GridBagLayout - sì, ti offre alcune belle opzioni di ridimensionamento e allineamento delle celle, ma non c'è niente che non si possa fare con alcuni pannelli con LayoutManager più semplici e il refactoring può essere un problema . E se fai le cose sbagliate puoi passare un'ora a trovare una falsa impostazione singolare. – Stroboskop