使用for循环打印到java GUI

时间:2017-06-03 01:25:18

标签: java swing for-loop

好的,我正在制作一个程序,要求我将变量打印到图形界面。因为我不知道有多少变量,我想使用for循环。问题是当我这样做时,我印刷的前一个文字消失了。即使我在GUI的不同区域打印文本。我怎么能用JLabel打印例如1 2 3 4 5每个数字20个像素,并且所有数字都保留在GUI上?

这是我到目前为止所提出的:

JFrame frame = new JFrame("Email Sender");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel contentPane = new JPanel();
contentPane.setOpaque(true);
contentPane.setBackground(Color.WHITE);
contentPane.setLayout(null);

frame.setContentPane(contentPane);
frame.setSize(100, 60);
frame.setLocationByPlatform(true);
frame.setVisible(true);

int a[]=new int[5];
a[0]=10;
a[1]=20;
a[2]=70;
a[3]=40;
a[4]=50;
JLabel num = new Jlabel;
for (int i = 0; i < a.length; i++)
{
    num.setText((String.valueOf(a[i]));
    num.setLocation(20*i, 20);
    contentPane.add(num);

}

1 个答案:

答案 0 :(得分:1)

所以,至少有三个基本问题......

一...

你只有一个组件,所以当你做这样的事情时......

JLabel num = new JLabel();
for (int i = 0; i < a.length; i++)
{
    num.setText((String.valueOf(a[i]));
    num.setLocation(20*i, 20);
    contentPane.add(num);

}

您所做的只是设置现有组件的属性并尝试添加到它已驻留的容器中,因此只有一个组件。

两个

您永远不会设置JLabel的大小,并且由于您决定使用null布局,因此您有责任这样做

在UI设置完成之前,您在框架上调用setVisible。虽然您可以这样做,但在显示框架之前建立UI更容易,因为它可以减少其他问题。如果您想以动态方式向框架添加组件,则需要在已将其添加到

的容器上调用revalidaterepaint

实施例...

现在,考虑到所有这些,你可以做更像这样的事情......

import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JPanel contentPane = new JPanel();
                contentPane.setBackground(Color.WHITE);
                frame.setContentPane(contentPane);

                int a[] = new int[5];
                a[0] = 10;
                a[1] = 20;
                a[2] = 70;
                a[3] = 40;
                a[4] = 50;
                for (int i = 0; i < a.length; i++) {
                    JLabel num = new JLabel((String.valueOf(a[i])));
                    num.setBorder(new EmptyBorder(0, 20, 0, 0));
                    contentPane.add(num);
                }
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

nb:我不喜欢,也不宽容使用null布局,因为人们“认为”他们需要这些布局,他们不会 < / p>

如果列出了可变数量的组件,您可能会发现使用JList更实用,因为它支持垂直和水平包装和滚动