java - Java 中同一 GridBagLayout 中 JTextField 和 JComboBox 的问题

标签 java swing jframe jtextfield gridbaglayout

我试图使用 GridBagLayout 将这两个元素添加到框架上,但是一旦我将 JComboBox 添加到 GridBagLayout 中,然后将其添加到框架中,JTextField 的宽度就会变得非常短,我不知道为什么或如何解决它。当我取出 JComboBox 时,它工作得很好,但我确实需要有 JComboBox,否则我无法完成该项目。任何有关如何解决此问题的帮助将不胜感激。这是代码:

package userInterface;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class AddSpend extends JFrame {

    public AddSpend(){
        setTitle("Add New Spend");
        setSize(300,200);
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setLayout(new GridBagLayout());
        create();
    }

    private void create(){
        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 0;
        c.gridy = 0;
        c.anchor = GridBagConstraints.LINE_END;
        add(new JLabel("Category: "), c);
        c.gridy++;
        add(new JLabel("Amount: "), c);
        c.gridy++;
        add(new JLabel("Date: "), c);

        c.gridx = 1;
        c.gridy = 0;
        c.anchor = GridBagConstraints.LINE_START;
        JComboBox<String> category = new JComboBox<String>();
        category.addItem("Test 1");
        category.addItem("Test 2");
        category.addItem("Test 3");
        add(category, c);
        c.gridy++;
        JTextField amount = new JTextField();
        add(amount, c);
        c.gridy++;
        JTextField date = new JTextField();
        add(date, c);
        c.gridy++;
        JButton today = new JButton("Today");
        today.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                Calendar now = Calendar.getInstance();
                date.setText((now.get(Calendar.MONTH) + 1) + "/" + now.get(Calendar.YEAR));
            }
        });
        today.setFont(today.getFont().deriveFont(7.0f));
        today.setPreferredSize(new Dimension(30,15));
        add(today, c);
        c.gridy++;
        JButton add = new JButton("Add Spend");
        add(add, c);
    }
}

最佳答案

建议:

  • 摆脱 setSize(300,200); 并将其替换为 pack(); 通过设置大小,您可以人为地将 GUI 限制为某个可能不是的大小它的最佳自然尺寸。通过在将所有组件添加到 GUI 后调用 pack(),允许每个组件将自身调整为自己计算出的最佳大小。
  • 此外,将 new JTextField(); 更改为 new JTextField(col_width);,其中 col_width 是一个 int,它是您希望 JTextField 显示的文本列数。这将建议 JTextField 增加其首选大小以容纳 col_width 字符数。
  • 还可以将插图添加到 GridBagConstraints
  • 仅在将所有组件添加到 GUI 之后而不是之前调用 pack()setVisible(true)

例如,

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class AddSpend extends JPanel {

    public AddSpend() {
        create();
    }

    private void create() {
        setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        int ins = 5;
        c.insets = new Insets(ins, ins, ins, ins);
        setBorder(BorderFactory.createEmptyBorder(ins, ins, ins, ins));

        c.gridx = 0;
        c.gridy = 0;
        c.anchor = GridBagConstraints.LINE_END;
        add(new JLabel("Category: "), c);
        c.gridy++;
        add(new JLabel("Amount: "), c);
        c.gridy++;
        add(new JLabel("Date: "), c);

        c.gridx = 1;
        c.gridy = 0;
        c.anchor = GridBagConstraints.LINE_START;
        JComboBox<String> category = new JComboBox<String>();
        category.addItem("Test 1");
        category.addItem("Test 2");
        category.addItem("Test 3");
        add(category, c);
        c.gridy++;
        JTextField amount = new JTextField(10);
        add(amount, c);
        c.gridy++;
        JTextField date = new JTextField(10);
        add(date, c);
        c.gridy++;
        JButton today = new JButton("Today");
        today.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Calendar now = Calendar.getInstance();
                date.setText((now.get(Calendar.MONTH) + 1) + "/" + now.get(Calendar.YEAR));
            }
        });
        today.setFont(today.getFont().deriveFont(7.0f));
        today.setPreferredSize(new Dimension(30, 15));
        add(today, c);
        c.gridy++;
        JButton add = new JButton("Add Spend");
        add(add, c);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Add New Spend");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new AddSpend());
            frame.pack();
            frame.setResizable(false);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

请注意,我更喜欢扩展 JPanel 而不是 JFrame。当您的类扩展 JFrame 时,您可能会陷入困境,迫使您创建和显示 JFrame,而通常需要更大的灵 active 。事实上,我敢说我创建的和见过的大多数 Swing GUI 代码都扩展 JFrame,而且事实上您很少会想要这样做这。更常见的是,您的 GUI 类将适合创建 JPanel,然后可以将其放入 JFrame 或 JDialogs 或 JTabbedPanes 中,或者在需要的地方通过 CardLayout 进行交换。这将大大增加 GUI 编码的灵 active 。

关于java - Java 中同一 GridBagLayout 中 JTextField 和 JComboBox 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34978564/

相关文章:

java - 在 Java 中创建属性框架

java - 更改 JFrame 的默认布局不起作用?

java - JPanel 未出现在 JOptionPane 内

java - 将菜单栏添加到 JFrame

java - 不同组件的布局问题?

java - 如何将来自 Web 服务的 'null' 值表示为真正的 null 或空字符串而不是 'null' 字符串

java - Maven项目运行良好,但很多项目在intellij中带有红色下划线

java - java中如何封装多个类?

java - 反射、哈希表或性能方法?

java - 从独立的 JFormDesigner 运行 GUI