java防止组件在帧大小调整时调整大小

时间:2017-07-24 05:12:20

标签: java swing

所以我有一堆组件在JPanel中布局,以制作一个允许用户输入字符的GUI。但是,当JFrame调整大小时,组件会变得疯狂并缩小一吨。有没有办法解决这个问题,或者我应该禁用调整JFrame的大小。我基本上希望它保持所有组件的大小相同,并在窗口太小时切断组件。我见过有人说GridBagLayout可以解决这个问题,但我仍然无法弄清楚如何做到这一点。

代码:

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);
    }

}

更多代码:

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);
    }

}

2 个答案:

答案 0 :(得分:1)

我建议只有在添加动态组件时才使用GridLayout或GridBagLayout,例如在用户按下按钮时添加JTextField。

我建议你使用BorderLayout。它很简单,你可以轻松玩。

例如:您有8个组件要放在JFrame上,但BorderLayout只有5个边。因此,使用BorderLayout添加父面板,将另一个JPanel(带BorderLayout)添加到父面板的北部。这样,您可以一共添加9个组件。

使用BorderLayout的主要优点是调整大小。调整大小时,组件也会相应调整大小。

希望这会对你有所帮助。 : - )

答案 1 :(得分:0)

这可能会有所帮助。以这种方式使用Event

GridBagConstraints

使用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(); 将帮助您消除组件的缩小。