【问题标题】:Print to java GUI with for loop使用 for 循环打印到 java GUI
【发布时间】:2017-06-03 01:25:18
【问题描述】:

好的,所以我正在制作一个需要我将变量打印到图形界面的程序。因为我不知道会有多少变量,所以我想使用 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);

}

【问题讨论】:

  • 小提示:在编译时创建已知数组时,请查看Array Literals。它只是更好的语法。
  • 在添加完所有内容后在框架上调用 setVisible

标签: java swing for-loop


【解决方案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 布局,因为人们一直“认为”他们需要它们,但实际上并不

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多