为什么我的JLabel没有显示?

时间:2013-11-08 09:41:13

标签: java swing grid jlabel layout-manager

我是一名新的Java学习者。

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

此类从用户处获取一个数字,并在Frame上显示一个表。

当我运行我的课程时,我输入一个数字并单击JButton,但我的框架上的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后添加组件吗?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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 revalidate

我建议您尝试使用LayoutManager代替setBounds()方法并使用null布局。

答案 2 :(得分: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);

好的,您要将JLabel添加到JFrame,更准确地添加到框架的内容窗格中,但您还没有在{{1}上调用repaint()更新GUI。只要在完成添加JFrame后立即致电f.repiant(),也可以获得一些临时满意的输出。

  

我们可以在创建和显示JFrame后添加组件吗?

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

现在还有更多的东西:

  1. 不使用repaint()布局(或绝对布局),
  2. 默认情况下,所有组件的可见标记均为Null,您不需要在此类组件上调用true,但应用程序窗口除外setVisible(true)
  3. Swing使用EDT进行GUI渲染任务。因此我们应该对GUI进行所有必要的更新,包括在启动时第一次显示我们的应用程序,也应该放在EDT中。 JFrame就是这么做的。
  4. <强>教程:

    1. Concurrency in Swing
    2. Lesson: Laying Out Components Within a Container