更改JLabel的文本 - 初学者

时间:2012-11-16 11:21:56

标签: java swing jlabel

我的代码;

package com.test;

import java.awt.EventQueue;

public class TestGU {

    private JFrame frame;
    private JLabel la;

    /**
     * Launch the application.
     */
    public  void mainM() {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TestGU window = new TestGU();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public void redefine(String text){
         la.setText(text);
    frame.repaint(); 

    }

    /**
     * Create the application.
     */
    public TestGU() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        la = new JLabel("New label");
        frame.getContentPane().add(null);
    }

}

我正在尝试从主方法(这是一个单独的类)中更改标签的文本,如下所示;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {

        TestGU g = new TestGU();
        g.mainM();
        g.redefine("New Value");
}
}

1。)当执行main方法时,我希望标签的文本为“New Value”,但它仍然包含文本New label。什么都没有改变,我怎么能纠正这个?

4 个答案:

答案 0 :(得分:6)

看起来您正在创建两个TestGU实例,而您的redefine方法会更改未显示的实例上的标签值。

现在就检查我的理论......

编辑:
您不需要创建第二个实例;你的mainM方法应该是;

public void mainM() {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

PS - 我认为你的初始化方法确实有这条线吗?

frame.getContentPane().add(la);

而不是add(null)因为根本不起作用。

答案 1 :(得分:2)

看看这个例子的想法。

TestGU

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

public class AnotherClass {

   public static void main(String[] args) {

        Runnable r = new Runnable() {
            public void run() {
               TestGU g = new TestGU();
               g.redefine("New Value");
            }
        };
        EventQueue.invokeLater(r);
    }
}

class TestGU {

    private JFrame frame;
    private JLabel la;

    public void redefine(String text){
         la.setText(text);
    }

    /**
     * Create the application.
     */
    public TestGU() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        la = new JLabel("New label");
        frame.getContentPane().add(la);
        frame.pack();
        frame.setVisible(true);
   }
}

答案 2 :(得分:2)

永远不要将JFrame用作顶级容器。

添加到JFrame的组件不是AWTEvent队列侦听的注册表。

因此,您的setText()不会为要重新绘制的组件创建正确的事件。

setContentPane( new JPanel(){{ add(la); }} );

它将按预期工作,无需调用任何绘制/重绘方法。

答案 3 :(得分:1)

您创建了TestGU的2个实例(Test中的1个和mainM()中的TestGU中的1个),只有1个可见。将您的mainM()方法更改为:

/**
 * Launch the application.
 */
public void mainM() {
    this.frame.setVisible(true);
}