2009-04-17 5 views
107

J'ai cette classe Java JFrame, dans lequel je veux utiliser un boxlayout, mais j'obtiens une erreur en disant java.awt.AWTError: BoxLayout can't be shared. J'ai vu d'autres avec ce problème, mais ils l'ont résolu en créant la boxlayout sur le contentpane, mais c'est ce que je fais ici. Voici mon code:BoxLayout ne peut pas être partagé erreur

class edit_dialog extends javax.swing.JFrame{ 
    javax.swing.JTextField title = new javax.swing.JTextField(); 
    public edit_dialog(){ 
     setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE); 
     setTitle("New entity"); 
     getContentPane().setLayout(
      new javax.swing.BoxLayout(this, javax.swing.BoxLayout.PAGE_AXIS)); 
     add(title); 
     pack(); 
     setVisible(true); 
    } 
} 

Répondre

156

Votre problème est que vous créez un BoxLayout pour un JFrame (this), mais la définir comme la mise en page pour un JPanel (getContentPane()). Essayez:

getContentPane().setLayout(
    new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS) 
); 
+0

Merci, a parfaitement fonctionné: D –

+1

Bien sûr, vous n'avez pas besoin premier getContentPane ... :-) –

+5

Oui, mais l'enlever confondrait la question, maintenant n'est-ce pas? –

61

J'ai aussi trouvé cette erreur faisant ceci:

JPanel panel = new JPanel(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 

Le JPanel n'est pas encore initialisé quand il passe à la BoxLayout. Donc diviser cette ligne comme ceci:

JPanel panel = new JPanel(); 
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 

Cela fonctionnera.

+0

juste couru dans ce domaine. Merci! – anon58192932

+0

Juste obtenu ce même problème, merci – Darc

+0

OUI MERCI: D –

13

Je pense qu'il ya une chose importante pour mettre en évidence des réponses précédentes est que l'objectif de la BoxLayout (le premier paramètre) doit être le même conteneur que la méthode setLayout est appelée comme dans l'exemple suivant:

JPanel XXXXXXXXX = new JPanel(); 
XXXXXXXXX.setLayout(new BoxLayout(XXXXXXXXX, BoxLayout.Y_AXIS)); 
+0

Bon principe =] – dmonopoly

0

Si vous utilisez la mise en page sur un JFrame comme:

JFrame frame = new JFrame(); 
frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS)); 
frame.add(new JLabel("Hello World!")); 

le contrôle est effectivement ajouté à la ContentPane il alors regardez comme il est « partagé » entre le JFrame et le ContentPane

Pour ce faire, à la place:

JFrame frame = new JFrame(); 
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); 
frame.add(new JLabel("Hello World!")); 
Questions connexes