2017-07-24 2 views
0

Also habe ich eine Reihe von Komponenten, die in einem JPanel ausgelegt sind, um eine GUI zu erstellen, mit der der Benutzer Zeichen eingeben kann. Wenn der JFrame jedoch in der Größe geändert wird, werden die Komponenten alle verrückt und schrumpfen eine Tonne. Gibt es eine Möglichkeit, dies zu beheben, oder sollte ich nur die Größenänderung des JFrame deaktivieren. Ich möchte grundsätzlich, dass alle Komponenten gleich groß sind und die Komponenten abgehackt werden, wenn das Fenster zu klein wird. Ich habe Leute gesehen, die sagen, dass GridBagLayout das beheben kann, aber ich kann immer noch nicht herausfinden, wie es geht.Java verhindern, dass Komponenten die Größe des Frames ändern

Code:

public class CharacterWrapper extends JPanel { 
    private int currentID = 0; 
    private JFrame parent; 
    private ArrayList<CharacterInput> inputSlots = new ArrayList<CharacterInput>(); 

    /** 
    * 
    */ 
    public CharacterWrapper(JFrame parent) { 
     this.parent = parent; 

     setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 

     JButton deleteButton = new JButton("Delete"); 
     deleteButton.addActionListener(e -> { 
      deleteInput(); 
      parent.pack(); 
     }); 

     JButton addButton = new JButton("Add"); 
     addButton.addActionListener(e -> { 
      addInput(); 
      parent.pack(); 
     }); 

     add(addButton); 
     add(deleteButton); 
     addInput(); 
     addInput(); 
     addInput(); 

    } 

    public void addInput() { 
     inputSlots.add(new CharacterInput(currentID++, this)); 
     add(inputSlots.get(inputSlots.size() - 1)); 
     revalidate(); 
    } 

    public void deleteInput() { 
     if (inputSlots.size() > 3) { 
      Component c = inputSlots.remove(inputSlots.size() - 1); 
      remove(c); 
      revalidate(); 
      currentID--; 
     } 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setContentPane(new CharacterWrapper(frame)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

} 

Und mehr Code:

public class CharacterInput extends JComponent{ 
    private int id; 
    private CharacterWrapper parent; 
    /** 
    * 
    */ 
    public CharacterInput(int id, CharacterWrapper parent) { 
    this.parent = parent; 
    this.id = id; 
    setLayout(new GridLayout(0, 1)); 
    GridBagConstraints gbc = new GridBagConstraints(); 

    JTextField textField = new JTextField(); 
    textField.addKeyListener(new KeyAdapter(){ 
     public void keyTyped(KeyEvent e) { 
      if (textField.getText().length() >= 1) 
       e.consume(); 
     } 
    }); 

    textField.setPreferredSize(new Dimension(35, 35)); 
    JLabel label = new JLabel(id + "", SwingConstants.CENTER); 
    add(textField); 
    add(label); 
    this.setBackground(Color.RED); 
    } 

} 
+0

Sie können möglicherweise ein 'GridBagLayout' verwenden, aber Sie müssen mit den Füll- und Gewichtsbeschränkungen herumspielen – MadProgrammer

Antwort

1

I recommened wird Gridlayout oder GridBagLayout nur zu verwenden, wenn Sie dynamische Komponenten hinaus haben JTextField wie das Hinzufügen, wenn der Benutzer eine Taste drückt.

Ich schlage vor, dass Sie BorderLayout verwenden. Es ist einfach und Sie können leicht spielen.

Zum Beispiel: Sie müssen 8 Komponenten auf JFrame platzieren, aber BorderLayout hat nur 5 Seiten. Fügen Sie also ein übergeordnetes Panel mit BorderLayout hinzu, fügen Sie ein weiteres JPanel (mit BorderLayout) zum Norden des übergeordneten Bereichs hinzu. Auf diese Weise können Sie insgesamt 9 Komponenten hinzufügen.

Der Hauptvorteil der Verwendung von BorderLayout ist die Größenanpassung. Wenn Sie die Größe ändern, wird auch die Größe der Komponenten entsprechend angepasst.

Hoffe, das wird Ihnen helfen. :-)

0

Vielleicht würde das ein bisschen helfen. Verwenden Sie GridBagConstraints auf diese Weise:

public void addInput() { 
gbc.fill = GridBagConstraints.HORIZONTAL; 
gbc.gridx = i; 
gbc.gridy = 0; 
gbc.weightx = 1; 
gbc.anchor = GridBagConstraints.CENTER; 
inputSlots.add(new CharacterInput(currentID++, this)); 
add(inputSlots.get(inputSlots.size() - 1), gbc); 
repaint(); 
revalidate(); 

gbc.weightx = 1 verwendet, wird Ihnen helfen bei der Beseitigung von Komponenten schrumpfen.

Verwandte Themen