我的代码;
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
。什么都没有改变,我怎么能纠正这个?
答案 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)
看看这个例子的想法。
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);
}