1

我正在编写一个程序,该程序从用户那里获取一些方程式。我希望在 a 中输入每个常数,每个常数JTextField由 a 分隔JTextArea(例如 +x0、+x1 等)。但是,我不能完全让格式化工作,我不知道为什么。以下是相关代码:

JTextField[][] dataTextFields = new JTextField[a+1][b+1];
JTextArea[][] dataLabels = new JTextArea[a][b+1]; 

for (int i = 0; i < a+1; i++)
{
    for (int j = 0; j < b+1; j++)
    {
        dataTextFields[i][j] = new JTextField(10);
        dataTextFields[i][j].setLocation(5+70*i, 10+30*j);
        dataTextFields[i][j].setSize(40,35);
        dataEntryPanel.add(dataTextFields[i][j]);

        if (i < a)
        {
            String build = "x" + Integer.toString(i) + "+";
            dataLabels[i][j] = new JTextArea(build);
            dataLabels[i][j].setBackground(dataEntryPanel.getBackground());
            dataLabels[i][j].setBounds(45+70*i,20+30*j,29,30);
            dataEntryPanel.add(dataLabels[i][j]);
        }
    }
}

这会在它们之间创建JTextFields0f JTextAreas"+xi"。但是,当我运行小程序时,它看起来像这样:

在此处输入图像描述

我可以点击标签并将它们带到前台,看起来,结果如下:

在此处输入图像描述

显然,我希望无需用户付出任何努力就可以看到标签。JTextArea 是否有一些属性可以更改以将其带到前台?我真的不想再添加任何 UI 元素(面板、容器等)。谢谢!

4

1 回答 1

0

我会使用GridBagLayout. GridBagLayout工作原理很像 HTML 表格,其中您有不同的单元格,这些单元格的高度和宽度会增加,以尝试最有效地容纳内容。对于您的特定布局,这样的事情会起作用:

public class SwingTest extends JFrame {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run () {
                new SwingTest().setVisible(true);
            }
        });
    }

    public SwingTest () {
        super("Swing Test");

        JPanel contentPane = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridy = 0;

        contentPane.add(createJTextField(), gbc.clone());
        contentPane.add(new JLabel("x0+"), gbc.clone());
        contentPane.add(createJTextField(), gbc.clone());

        // go to next line
        gbc.gridy++;

        contentPane.add(createJTextField(), gbc.clone());
        contentPane.add(new JLabel("x0+"), gbc.clone());
        contentPane.add(createJTextField(), gbc.clone());

        setContentPane(contentPane);

        pack();
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private JTextField createJTextField () {
        JTextField textField = new JTextField(4);
        textField.setMinimumSize(textField.getPreferredSize());
        return textField;
    }
}

GridBagLayout 是最复杂(但灵活)的布局,需要配置很多参数。还有一些更简单的,比如 FlowLayout、BorderLayout、GridLayout 等,它们也可以相互结合使用来实现复杂的布局。

Swing 教程中,有一个关于布局组件的非常好的部分。如果您计划花费大量时间来构建 Swing GUI,那么它可能值得一读。

请注意,有一个奇怪的警告GridBagLayout:如果您要JTextField在 a 中使用 a GridBagLayout,则有一个愚蠢的问题(在此处描述)如果无法以首选尺寸呈现,则会导致它们以最小尺寸呈现(这导致它们显示为微小的缝隙)。为了克服这个问题,我在JTextField构造函数上指定了列数,以便最小值是合理的,然后将最小大小设置为首选大小。

于 2013-11-08T21:04:01.607 回答