2012-03-02 15 views
5

Ho un'interfaccia utente di dimensioni medio-grandi che utilizza un BorderLayout; il centro è un pannello a schede che contiene vari pannelli con vari layout, eccMantenere le dimensioni preferite dei componenti al centro di BorderLayout

voglio il pannello al centro di questo layout a bordo per ridimensionare in base alle dimensioni del finestra, ma non voglio i componenti all'interno il pannello da allungare. Etichette, caselle combinate, campi di testo, pulsanti: desidero che rimangano alle dimensioni preferite e consentono al riquadro che li contiene di allungare. Li metto in un riquadro di scorrimento nel caso lo spazio diventi troppo piccolo per il pannello.

Vari poster con vocaboli colorati mettono in guardia dal pericolo di utilizzare uno qualsiasi dei metodi setXXXsize() sui componenti. Questo è quello che faccio adesso, e mi piacerebbe imparare come evitarlo.

GridBagLayout non è appropriato per alcuni dei miei pannelli. È, per sua natura, orientato su righe e colonne, e non tutto si adatta a righe e colonne. Ovviamente potrei creare righe e colonne artificiali per adattarle a tutto, ma spero davvero che Swing abbia più opzioni di layout di quelle.

La colla verticale non lo fa neanche. Ho incluso nella amata SSCE di HFOE:

package example; 

    import java.awt.BorderLayout; 

    import javax.swing.Box; 
    import javax.swing.BoxLayout; 
    import javax.swing.JComboBox; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 

    public class BorderAndBox extends JFrame 
    { 
     public static void main(String args[]) 
     { 
      BorderAndBox bnb = new BorderAndBox(); 
      bnb.createUI(); 
      bnb.setVisible(true); 
     } 

     public void createUI() 
     { 
      JPanel borderPanel = new JPanel(new BorderLayout()); 

      JLabel northLabel = new JLabel("Nawth"); 
      borderPanel.add(northLabel, BorderLayout.NORTH); 

      String[] southComboChoices = { "one", "two", "three" }; 
      JComboBox southCombo = new JComboBox(southComboChoices); 
      borderPanel.add(southCombo, BorderLayout.SOUTH); 

      JPanel centerPanel = new JPanel(); 
      centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS)); 
      String[] firstChoices = { "first", "uno", "UN" }; 
      String[] secondChoices = { "second", "dos", "zwei" }; 
      String[] thirdChoices = { "third", "tres", "drei" }; 
      JComboBox firstCombo = new JComboBox(firstChoices); 
      JComboBox secondCombo = new JComboBox(secondChoices); 
      JComboBox thirdCombo = new JComboBox(thirdChoices); 
      centerPanel.add(firstCombo); 
      centerPanel.add(secondCombo); 
      centerPanel.add(thirdCombo); 
      centerPanel.add(Box.createVerticalGlue()); // first attempt; does NOT 
      // take up available vertical space, instead it appears to create a space 
      // that is shared equally among the (now) four components of this space. 
      borderPanel.add(centerPanel, BorderLayout.CENTER); 

      getContentPane().add(borderPanel); 
      pack(); 
     } 

    } 

Se si ingrandisce la finestra, le caselle combinate al centro ingrandire; come scritto, un pezzo di colla verticale sotto di loro si allarga, ma non occupa tutto lo spazio disponibile. Sembra che gli venga dato tanto spazio quanto ciascuno di essi.

Quindi, qual è un buon modo per avvicinarsi a questo?

+0

* ".. SSCE amato:" * Lo amo anche io. Ed è SSCCE (2 C). ;) –

+0

non può essere solo un piccolo esempio autonomo? – arcy

+0

* "non può essere solo un piccolo esempio autonomo?" * [Quoting] (http://sscce.org/#co) una delle mie persone preferite: * "In questo documento, corretto (o compilabile, che si riferisce in particolare al codice sorgente del computer) significa assicurare che il tuo esempio si adatti agli standard e ai protocolli accettati. "* sottotitolo più importante *" Assicurati che il tuo esempio sia corretto. L'esempio si compila in modo pulito, o causa l'esatto messaggio di errore voglio aiuto. "* Il codice compilato e mostrato il problema, facile da fare. È * un * SSCCE. :) –

risposta

10

BorderAndBox - centered

import java.awt.BorderLayout; 
import java.awt.GridBagLayout; 

import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class BorderAndBox extends JFrame 
{ 
public static void main(String args[]) 
{ 
    BorderAndBox bnb = new BorderAndBox(); 
    bnb.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    bnb.createUI(); 
    bnb.setVisible(true); 
} 

public void createUI() 
{ 
    JPanel borderPanel = new JPanel(new BorderLayout()); 

    JLabel northLabel = new JLabel("Nawth"); 
    borderPanel.add(northLabel, BorderLayout.NORTH); 

    String[] southComboChoices = { "one", "two", "three" }; 
    JComboBox southCombo = new JComboBox(southComboChoices); 
    borderPanel.add(southCombo, BorderLayout.SOUTH); 

    JPanel centerPanel = new JPanel(); 
    centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS)); 
    String[] firstChoices = { "first", "uno", "UN" }; 
    String[] secondChoices = { "second", "dos", "zwei" }; 
    String[] thirdChoices = { "third", "tres", "drei" }; 
    JComboBox firstCombo = new JComboBox(firstChoices); 
    JComboBox secondCombo = new JComboBox(secondChoices); 
    JComboBox thirdCombo = new JComboBox(thirdChoices); 
    centerPanel.add(firstCombo); 
    centerPanel.add(secondCombo); 
    centerPanel.add(thirdCombo); 
    centerPanel.add(Box.createVerticalGlue()); // first attempt; does NOT 
    // take up available vertical space, instead it appears to create a space 
    // that is shared equally among the (now) four components of this space. 
    JPanel centerPanelConstrain = new JPanel(new GridBagLayout()); 
    centerPanelConstrain.add(centerPanel); 
    borderPanel.add(centerPanelConstrain, BorderLayout.CENTER); 

    getContentPane().add(borderPanel); 
    pack(); 
} 

} 

Vedi anche this answer. C'è più di un modo per risolvere questo.

+0

Questo è un trucco carino; Suppongo di poter giocare con GridBagLayout del mio singolo componente per farlo apparire in alto a sinistra, come vorrei. Ti piacerebbe approfondire perché questo funziona? – arcy

+0

* "Vorresti approfondire il motivo per cui funziona?"* Un singolo componente aggiunto a un GBL senza vincoli, finisce nel centro. Come per qualsiasi altra posizione, non ne sono sicuro.Posso solo GBL per centrare i singoli componenti, e una volta tanto tempo fa per una tabella periodica (organizzazione ogni elemento). Probabilmente oggi farei quest'ultimo usando 'GroupPlayout' .Non sono esperto di GBL. –

+0

GroupPlayout? LOL, +1 però, anch'io stavo per postare la stessa logica, ma sembra che lo sia anch'io –

-1

ti consiglierei di utilizzare JPanel con javax.swing.GroupLayout. Tuttavia non è facile usare questo layout codificandolo. Utilizzare generatori di codice come Netbeans Matisse Builder e copiarlo incollarlo ovunque si desideri, se non si desidera utilizzare l'IDE.

+1

GroupLayout, come GridBagLayout, riguarda esclusivamente righe e colonne; Potrei usare un GroupLayout nello stesso modo in cui Thompson mi ha appena mostrato GridBagLayout, vedrò se è più facile inserirmi nell'angolo in alto a sinistra come voglio. Ma penso che sia i layout di gruppo che quelli di GridBag siano scarsi per i pannelli con un numero di componenti ma nessun aspetto di riga/colonna. – arcy

Problemi correlati