2012-11-15 7 views
1

다음의 클래스에서 Label을 그립니다. (나는 여기에 코드의 일부만을 주었다). Everyhting 잘 작동 레이블이 표시됩니다.다른 클래스의 JLabel 텍스트를 변경하십시오.

이제는 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); 
      ..... 
    } 

나중에, 위의 레이블의 텍스트를 변경하려면 다음 클래스를 사용합니다. 어떻게해야합니까? methodA()가 실행되면

public class Caller { 

void methodA(){ 
MyClass mc = new MyClass(); 
mc.editTheLabelsValue("Hello"); 
} 

} 

1.

), 텍스트 Hello는 레이블 필드에 표시 점점되지 않습니다. 여전히 Whooo으로 남아 있습니다. 이 문제를 어떻게 해결할 수 있습니까? 해당 메서드가 실행되면 레이블 텍스트를 Hello으로 지정합니다.

+1

코드가 지정된대로 작동하는 것 같습니다. 그것은 어떻게 작동하지 않습니까? – PearsonArtPhoto

+0

'methodA()'가 실행되면'Hello'라는 텍스트가 Label 필드에 표시되지 않습니다. 그것은 여전히'Whooo'로 남아 있습니다. –

+0

'label.setBounds (0, 0, 50, 100); – Reimeus

답변

2

내가 볼 수있는 immeditate 문제는 null 레이아웃을 사용하고 있거나 레이아웃 관리자의 작동 방식을 이해하지 못하는 것입니다.

다음 코드는 setText 메서드 호출을 통해 하위 클래스의 주 클래스에서 레이블을 업데이트합니다. 당신이 null 레이아웃을 사용하는 경우이 방법은 매 초마다

enter image description here

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 레이아웃을 사용하는 횟수가 매우 적으며이 중 하나가 아닌 것으로 판단됩니다.

관련 문제