JTextArea在Swing中被切断

时间:2013-10-24 21:40:35

标签: java swing

我正在编写一个从用户那里获取一些方程式的程序。我希望每个常量都输入JTextField,每个常数用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]);
        }
    }
}

这会创建JTextFields JTextAreas 0f&#34; + xi&#34;在他们之间。但是,当我运行applet时,它看起来像这样:

enter image description here

我可以点击标签并将它们带到前台,看起来就是这样:

enter image description here

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

1 个答案:

答案 0 :(得分: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 Tutorial中,Laying Out Components上有一个非常好的部分。如果您计划花费大量时间来构建Swing GUI,那么可能值得一读。

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