2015-09-26 113 views
0

我有两个类MainFrameTestMainFrame类包含两个组件a JButtonJLabel从另一个类更改JLabel文本不起作用

我想,当我调用setText()方法从Test类由Test类创建的MainFrame的情况下,当我点击JButtonJLabel的文本改变。但不幸的是setText()getText()工作从Test类。我怎样才能实现它?

这是我的代码。

MainFrame.java

public class MainFrame extends javax.swing.JFrame { 

    public MainFrame() { 
     initComponents(); 
    } 

    private void initComponents() { 

     labelToSet = new javax.swing.JLabel(); 
     clickMeButton = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     labelToSet.setText("Hello"); 

     clickMeButton.setText("Click me"); 
     clickMeButton.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       clickMeButtonActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addContainerGap(84, Short.MAX_VALUE) 
       .addComponent(clickMeButton) 
       .addGap(50, 50, 50) 
       .addComponent(labelToSet) 
       .addGap(110, 110, 110)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(98, 98, 98) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(labelToSet) 
        .addComponent(clickMeButton)) 
       .addContainerGap(79, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }      

    /*Code to be concentrated*/ 
    private void clickMeButtonActionPerformed(java.awt.event.ActionEvent evt) {            
     Test t = new Test(); 
    }            

    public static void main(String args[]) { 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 

     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new MainFrame().setVisible(true); 
      } 
     }); 
    } 

    public javax.swing.JButton clickMeButton; 
    public javax.swing.JLabel labelToSet;     
} 

Test.java

public class Test { 

    Test() { 
     MainFrame mf = new MainFrame(); 
     System.out.println(mf.labelToSet.getText()); 
     mf.labelToSet.setText("Goodbye!"); 
    } 
} 

回答

4

你正在改变的labelToSet文本在不同的实例类MainFrame,实例这从来没有在屏幕上显示。

如果您希望Test的构造函数中的代码更改已显示的标签文本,则需要将它传递给该MainFrame对象的引用。

更改Test构造函数接受参考:

public class Test { 
    Test(MainFrame mf) { 
     mf.labelToSet.setText("Goodbye!"); 
    } 
} 

并据此把它(通过基准this到当前正在显示的MainFrame对象):

private void clickMeButtonActionPerformed(java.awt.event.ActionEvent evt) { 
    Test t = new Test(this); 
}