JLabel文字没有出现

时间:2015-10-05 08:59:25

标签: java swing jlabel

我是Java新手。我想在单击虚拟按钮后在JLabel上显示文本。但是,我似乎无法找到解决方案。当我使用if语句时,它不会起作用。如何在按下按钮后显示文本?

import java.awt.event.*;  
import javax.swing.JFrame;  
import javax.swing.JLabel;  
import javax.swing.JButton;  
import javax.swing.JPanel;  
import java.awt.Graphics;  

public class autos extends JLabel implements ActionListener  
{
    private static final long serialVersionUID = 1L;  
    int now=0;
    public autos(){
        JLabel l=new JLabel("");
        JFrame f=new JFrame("the title");
        JPanel p=new JPanel();
        JButton b=new JButton("click");
        f.setBounds(400,500,400,500);
        f.setVisible(true);
        p.add(b);
        f.add(p);
        b.addActionListener(this);
        p.setVisible(true);
        p.add(l);
        f.add(l);
        if(now==1)
        {
            l.setText("hello");
            l.setOpaque(true);
        }
        p.setBounds(200,200,200,200);
        l.setBounds(100,100,100,100);
        l.setOpaque(true);
        f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawRect(200,300,89,90);
        g.drawString("buv",80,80);
        repaint();
    }
    public static void main(String[] args)
    {
        new autos();    
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        now=1;
        System.out.println("worked");
        System.out.println(now);
    }
} 

2 个答案:

答案 0 :(得分:2)

您正在构造函数代码中设置标签,该代码在将now变量设置为1的事件处理程序之前执行。

您可以做的是移动此代码:

 l.setText("hello");
 l.setOpaque(true);

到这里:

@Override
public void actionPerformed(ActionEvent e) {
    now=1;
    System.out.println("worked");
    System.out.println(now);

    l.setText("hello");
    l.setOpaque(true);    
}

答案 1 :(得分:1)

这是在按钮点击时更新文本的最低限度工作示例。请参阅代码中的注释,了解各种更改。

import java.awt.event.*;
import javax.swing.*;

/* There is no need to extend label here. */
// public class autos extends JLabel implements ActionListener 
public class autos implements ActionListener {

    private static final long serialVersionUID = 1L;
    int now = 0;
    // this is now a class attribute, accessible to any method of this class.
    JLabel l;

    public autos() {
        // this no longer declares a local variable, but instead
        // creates an instance of the class attribute.
        l = new JLabel("");
        JFrame f = new JFrame("the title");
        JPanel p = new JPanel();
        JButton b = new JButton("click");
        f.setBounds(400, 500, 400, 500); // this needs fixing!
        f.setVisible(true);
        p.add(b);
        f.add(p);
        b.addActionListener(this);
        p.setVisible(true);
        p.add(l);
        f.add(l);
        p.setBounds(200, 200, 200, 200); // this needs fixing!
        l.setBounds(100, 100, 100, 100); // this needs fixing!
        l.setOpaque(true);
        f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
    }
    /* I cannot tell what this was trying to achieve, but whatever it was,
    this was the wrong way to go about it.  Never call repaint() from within 
    the paintComponent method as this creates an infinite loop! */
    /*
     public void paintComponent(Graphics g) {
     super.paintComponent(g);
     g.drawRect(200, 300, 89, 90);
     g.drawString("buv", 80, 80);
     repaint();
     }
     */

    public static void main(String[] args) {
        // Swing GUIs should be created and updated on the EDT
        new autos();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        /* This logic is questionable, but it denpends on what you are trying
        to achieve here, something I'm not clear on. */
        now = 1;
        if (now == 1) {
            l.setText("hello");
            l.setOpaque(true);
        }
        System.out.println("worked");
        System.out.println(now);
    }
}

修改

  

您在setBounds部分添加了两条评论this needs fixing!。在那里,我尝试调整JPanelJLabel的大小,但很明显它不起作用   我该怎么办?

以下是我经常使用的一些“复制/粘贴评论”:

  1. Java GUI必须使用不同语言环境中的不同PLAF来处理不同的操作系统,屏幕大小,屏幕分辨率等。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them以及white space的布局填充和边框。
  2. 请参阅Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?(是)。
  3. 以最小尺寸提供ASCII艺术或GUI的预期布局的简单绘图,如果可调整大小,则具有更大的宽度和高度。
  4. 现在,扩展这个用例的评论:

    1. 这是我为试图制作null布局的人提供的建议,但它也适用于此处。
    2. 这是相关的,因为有一个组件(自定义绘制的一个组件,如果存在)需要@Override getPreferredSize(..)方法将大小作为建议返回给布局管理器或用于打包顶级容器。
    3. 第3条评论是因为在不知道所需的最终效果的情况下很难建议如何编写此GUI。
    4. 当然,我应该指出:每个SO线程都应该是一个特定的问题。我真的应该告诉你在其他问题上开始一个新的问题,但是让它滑动进行这个编辑。