我有以下绘制Label的类。 (我这里只给出了部分代码)。 Everyhting工作正常,标签会显示出来。
现在,我有另一个名为Caller
Class的类。我有一个方法,我将用于更改此标签的值。我怎么能这样做
public class MyClass{
private JLabel label;
MyClass(){
run();
}
public void editTheLabelsValue (String text) {
label.setText(text);
frame.repaint();
}
run(){
.... // there were more code here, i removed it as it's not relevant to the problem
label = new JLabel("Whooo");
label.setBounds(0, 0, 50, 100);
frame.getContentPane().add(label);
.....
}
稍后,我将使用以下类来更改上述标签的文本。我怎样才能做到这一点。
public class Caller {
void methodA(){
MyClass mc = new MyClass();
mc.editTheLabelsValue("Hello");
}
}
1。)执行methodA()时,文本Hello
未显示在Label字段上。它仍然是Whooo
。我怎么能纠正这个。执行该方法后,我希望标签文本为Hello
。
答案 0 :(得分:2)
我看到的immeditate问题似乎是您要么使用null
布局,要么您不了解布局管理器的工作方式。
以下代码通过setText
方法调用更新子类中主类的标签。每秒调用此方法
public class PaintMyLabel {
private int counter = 0;
public static void main(String[] args) {
new PaintMyLabel();
}
public PaintMyLabel() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
final MasterPane master = new MasterPane();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(master);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
Timer timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
counter++;
master.setText("Now updated " + counter + " times");
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
});
}
public class MasterPane extends JPanel {
private JLabel label;
public MasterPane() {
label = new JLabel("Original text");
setLayout(new GridBagLayout());
add(label);
}
public void setText(String text) {
label.setText(text);
}
}
}
如果您使用null
布局,请将其停止。只是不要。您使用null
布局的次数很少,我怀疑这不是其中之一。