1

ラベルを描画する次のクラスがあります。(ここではコードの一部のみを示しています)。すべてが正常に機能し、ラベルが表示されます。

今、私はクラスと呼ばれる別のクラスを持っていますCaller。このラベルの値を変更するために使用するメソッドがあります。どうやってやるの

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そのメソッドが実行されたら、ラベルのテキストを表示したい。

4

1 に答える 1

2

私が見ることができる差し迫った問題は、レイアウトを使用しているか、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これはその 1 つではないと思います。

于 2012-11-15T22:03:22.067 に答える