Java 从另一个类更改JLabel文本

Java 从另一个类更改JLabel文本,java,swing,Java,Swing,我有一个绘制标签的类。(我在这里只给出了部分代码)。一切正常,标签就会显示出来 现在,我有另一个类叫做Callerclass。我有一个方法,我将使用它来更改这个标签的值。我该怎么做 public class MyClass{ private JLabel label; MyClass(){ run(); } public void editTheLabelsValue (String text) { label.setText(te

我有一个绘制标签的类。(我在这里只给出了部分代码)。一切正常,标签就会显示出来

现在,我有另一个类叫做
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
。它仍然是
Whooo
。我怎样才能纠正这个问题。执行该方法后,我希望标签文本为
Hello

我能看到的直接问题是,您可能正在使用
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
布局的次数很少,我怀疑这不是其中之一。

您的代码似乎按照指定的方式工作。如果它不起作用呢?当执行
methodA()
时,文本
Hello
不会显示在标签字段上。它仍然保持为
Whooo
正在调用
label.setBounds(0,0,50,100)?除非您正在阻止EDT,否则此代码应该有效。另外,frame.repaint()是不必要的,而且效率太低。如果你想不出一个解决方案,试着发布一个。这样做会让你自己找到问题,或者在这个论坛上发布一个例子,让人们直接回答你的问题并给出清晰的解释。我强烈建议你试试。@Reimeus打字错误,我会改正的