0

我是一个新的Java学习者。

我正在创建一个 GUI 应用程序。

此类从用户那里获取一个数字并在 Frame 上显示一个表格。

当我运行我的课程时,我输入一个数字并单击 JButton,但我的 Frame 上的 JLabel 没有显示。

它没有告诉我为什么不。

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.event.*;
//this Frame class use the association   
class Frame {
    JFrame f;
    JButton jb,jbclear;
    JTextField jt;
    JLabel jl1[]=new JLabel[10];
    EventHandler hand=new EventHandler();
    //constructor
    Frame(){
        f=new JFrame("Hello");
        f.setSize(500,500);
        f.setLayout(null);

        JLabel jl=new JLabel("Enter the number");
        jl.setBounds(30,10,100,20);
        f.getContentPane().add(jl);

        jt=new JTextField();
        jt.setBounds(170,10,50,20);
        f.add(jt);

        jb=new JButton("Click");
        jb.setBounds(270,50,80,30);
        f.add(jb);
        jb.addActionListener(hand);

        jbclear=new JButton("Clear");
        jbclear.setBounds(270,90,80,30);
        f.add(jbclear);
        jbclear.addActionListener(hand);
        f.setVisible(true);


    }
    class EventHandler implements ActionListener{
        public void actionPerformed(ActionEvent e){
            if(e.getSource()==jb){
                 int num=Integer.parseInt((jt.getText()));
                    for(int i=0;i<10;i++){
                        int n=(num*i);
                        String s=String.valueOf(num)+" X "+i+" = "+n;
                       jl1[i]=new JLabel(s);
                    }
                    for(int i=0,k=80;i<10;i++){
                     jl1[i].setBounds(30,k,150,10);
                     f.add(jl1[i]);
                     jl1[i].setVisible(true);
                     k=k+30;
                    }

            }
            if(e.getSource()==jbclear){
                for(int i=0;i<10;i++){
                   jl1[i].setText("");
                }
            }

        }
    }






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

    }

}

我们可以在创建并显示一个 JFrame 之后添加一个组件吗?

4

3 回答 3

1
             for(int i=0;i<10;i++){
                 int n=(num*i);
                 String s=String.valueOf(num)+" X "+i+" = "+n;
                 jl1[i]=new JLabel(s);
             }
             for(int i=0,k=80;i<10;i++){
                jl1[i].setBounds(30,k,150,10);
                f.add(jl1[i]);
                jl1[i].setVisible(true);

好的,您正在添加JLabelJFrameFrame 的内容窗格中,更准确地说,但您还没有调用repaint()更新JFrameGUI。只需致电,f.repiant()一旦您完成添加,labels也会有一些输出暂时满足。

我们可以在创建并显示一个 JFrame 之后添加一个组件吗?

是的,但我们应该使用适当的布局管理器,添加组件后,我们应该调用revalidate()repaint()适当地呈现 GUI。

现在还有一些事情:

  1. 不要使用Null布局(或绝对布局),
  2. 默认情况下,所有组件的可见标志都是true默认的,您不需要调用setVisible(true)此类组件,除非使用应用程序窗口,例如,JFrame
  3. Swing 使用 EDT 来完成它的 GUI 渲染任务。因此,我们应该对 GUI 进行所有必要的更新,包括在启动时首次显示我们的应用程序,也应该放在 EDT 中。SwingUtilies.invokeLater(new Runnabe(){})这样做。

教程:

  1. Swing 中的并发性
  2. 课程:在容器中布置组件
于 2013-11-08T10:10:16.683 回答
1

您创建标签jl1[i]=new JLabel(s),但它们不会添加到容器中。

不要使用 null layout/setBounds() 而是选择一个合适的(例如GridLayoutor BoxLayout

于 2013-11-08T09:45:37.113 回答
1

你的问题是下一个:

1)以相同的方式添加所有组件,就像那样f.getContentPane().add(),因为你添加了你的组件f.getContentPane().add()f.add()它是不同的容器。

2)如果你将组件添加到可见的Frame/Panel/Container,你必须在添加后调用容器上的revalidate()repaint()方法,因为没有这些方法,添加的组件将是不可见的。我改变你ActionListener的下一个方式(它做你想要的):

 class EventHandler implements ActionListener{
    public void actionPerformed(ActionEvent e){
        if(e.getSource()==jb){
             int num=Integer.parseInt((jt.getText()));
                for(int i=0;i<10;i++){
                    int n=(num*i);
                    String s=String.valueOf(num)+" X "+i+" = "+n;
                   jl1[i]=new JLabel(s);
                }
                for(int i=0,k=80;i<10;i++){
                 jl1[i].setBounds(30,k,150,10);
                 f.getContentPane().add(jl1[i]);

                 k=k+30;
                }
                f.getContentPane().revalidate();
                f.getContentPane().repaint();

        }
        if(e.getSource()==jbclear){
            for(int i=0;i<10;i++){
             f.getContentPane().remove(jl1[i]);
            }
            f.getContentPane().revalidate();
            f.getContentPane().repaint();
        }

    }
}

JFrame 重新验证

我建议您尝试使用LayoutManager而不是setBounds()具有空布局的方法。

于 2013-11-08T10:01:20.997 回答