3

我的代码;

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 label。什么都没有改变,我该如何纠正这个?

4

4 回答 4

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)因为那根本不起作用。

于 2012-11-16T11:28:45.460 回答
2

看看这个例子的想法。

测试GU

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);
   }
}
于 2012-11-16T11:38:37.773 回答
2

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

添加到 JFrame 的组件未注册以供 AWTEvent 队列侦听。

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

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

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

于 2012-11-16T13:22:00.147 回答
1

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

/**
 * Launch the application.
 */
public void mainM() {
    this.frame.setVisible(true);
}
于 2012-11-16T11:33:36.567 回答