2012-11-28 64 views
1

我有两个clases GUI(这renderes我的主要的JFrame)和打印类(即由JButton的调用上GUI类)。现在,在我的GUI类,我有JTextArea中和的方法:静态方法来分配非静态变量

void setOutput(String data) 
{ 
    // output is JTextArea 
    output.setText(data); 
} 

但是数据提供了打印的JFrame在那里我有一个JButton用行动听众:

sizOpt.addActionListener(new ActionListener() 
{  
    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
     // textfield is a JTextField component 
     String data = textfield.getText(); 


     // My problem is here i need to invoke the setOutput 
     // method in GUI to output the string however i cant call that method in 
     // any way but making it static or calling new GUI which will create a new 
     // Instance of GUI class 
     GUI.setOutput(data); 
    } 
}); 
+2

那么......这个问题是怎么回事?很好很抱歉看到它,但是真的不应该把你的实际问题放在代码示例中的注释中。 –

+0

对不起,这是上午5点,我的眼睛正在放血,我的思想即将临近突破点。 –

回答

2

答案是:不在这里使用静态任何东西。

应该是静态的唯一事情是你的主要方法,而这可能是它。如果您需要调用的GUI的方法,然后调用它的上实例的可视化图形用户界面的,而不是一个静态方法。通常棘手的部分是获取有效的引用,并且你是正确的,你不应该创建一个新的GUI对象,但也不要试图做一个非工作的静态解决方案。一些获取有效引用的方法是通过构造函数参数或setter方法。

public class PrintJFrame extends JFrame { 
    private GUI gui; 

    public PrintJFrame(GUI gui) { 
    this.gui = gui; 
    } 

    // ... 
} 

现在在你的ActionListener,你可以调用由GUI变量保持的正确GUI参考的方法。接下来我们将讨论为什么您应该避免让类扩展JFrame和类似的GUI组件。 接下来我们'

+0

我的主要方法是在一个单独的类中,我称之为类属性GUI g;并在主要我有g =新的GUI();那么我有一个名为g.setOutput(data)的静态方法引用(String data);我在我的打印类中调用main class.reference。然而,我更喜欢你的方法,所以我会重写它没有太多的工作,最终会更好地工作。 –

+0

@kellax:很高兴帮助! –

1

对JFrame子类的实例进行静态引用,并在JFrame上使用适当的实例方法来检索文本。

+0

只要在其他类的非静态实例上调用适当的方法,他会更好吗? –

+0

我试图对代码提出最小限度的更改,但重新考虑仅仅对JFrame进行静态引用就不那么费力。已通过回答修改。 –