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);
}
}
Sie können möglicherweise ein 'GridBagLayout' verwenden, aber Sie müssen mit den Füll- und Gewichtsbeschränkungen herumspielen – MadProgrammer