如何访问“private void initialize”之外的对象?

时间:2015-10-13 05:05:49

标签: java

我是Java的新手,我正在使用Eclipse Mars的WindowBuilder插件开发我的第一个GUI。

在“private void initialize”中,它创建了我的对象:TextArea和JButton。

我希望能够在一个方法中操作我的TextArea,但我不能简单地输入如下内容: txtOutput.setText( “测试”);

(我希望我的JButton调用一个方法并让方法完成所有的工作,因为我还有一个菜单项会做同样的事情,所以将我的代码放入一个方法并拥有菜单是有意义的item和按钮调用方法。我的actionPerformed事件处理程序正在工作,他们调用方法,但方法无法“看到”txtOutput。)我猜测某些关键字需要在 txtOutput <前面/ em>的

我需要在txtOutput前放置什么?

很抱歉这是一个新手。我希望我已经很好地解释了这一点。感谢您提供任何帮助。

以下是我的代码的副本:

package Junkpad;

import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import java.awt.TextArea;
import java.awt.Toolkit;

import javax.swing.JButton;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class GUITest {

    private JFrame frame;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
            try {
                GUITest window = new GUITest();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
            }
        });
    }

    public GUITest() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.setResizable(false);
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        frame.setTitle("My First GUI");

        TextArea txtOutput = new TextArea();
        txtOutput.setBounds(0, 20, 442, 197);
        frame.getContentPane().add(txtOutput);

        JButton btnChangeText = new JButton("Change Text");
        btnChangeText.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent actEvent) {
                Object srcSource = actEvent.getSource();
            if (srcSource == btnChangeText) {
                ChangeText();
            }
            }
        });
        btnChangeText.setBounds(247, 223, 180, 29);
        frame.getContentPane().add(btnChangeText);

        JMenuBar menuBar = new JMenuBar();
        menuBar.setBounds(0, 0, 442, 27);
        frame.getContentPane().add(menuBar);

        JMenu mnFile = new JMenu("File");
        menuBar.add(mnFile);

        JMenuItem mntmChangeText = new JMenuItem("Change Text");
        mntmChangeText.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent actEvent) {
                Object srcSource = actEvent.getSource();
            if (srcSource == mntmChangeText) {
                ChangeText();
            }
            }
        });
        mnFile.add(mntmChangeText);

        // center frame on screen
        Dimension dimDimension = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setLocation((dimDimension.width-frame.getSize().width)/2, (dimDimension.height-frame.getSize().height)/2);
    }

    private static void ChangeText(){
        // here is where I want to change the text of txtOutput
        // none of these attempts work:
            //txtOutput.setText("testing");
            //GUITest.txtOutput.setText("testing");
            //initialize.txtOutput.setText("testing");
            //this.txtOutput.setText("testing");

        // the calls from the actionPerformed event handlers are working
        // because this code runs when I click the button or the menu item 
        System.out.println("ChangeText was called");
    }
}

1 个答案:

答案 0 :(得分:3)

你必须意识到两件事:可见度和寿命。

在方法中,范围是块,生命周期是其执行的持续时间。

void init(){
    int i = 42;
    JTextArea myText = ...;

}

两个都可以看到直到块的末尾(})并且我在init返回时消失了,并且通过myText引用的对象也将消失,除非你将引用复制到其他地方,也许是封闭小组。

class Foo {
    int j;
    JTextArea ourText;

    void m1(){ }
    void m2(){ }
}

j和ourText都可以在类的所有方法中看到。每当创建一个Foo时,它们都存在于Foo类的对象中。因此,可能有许多j和许多我们的文本,但是当你调用aFoo.m1()或bFoo.m1()时你可以清楚地识别它们,所以它们不会被混淆。

可以说更多......但这可以帮助你解决问题。

编辑现在,我看到代码,我可以说是

的声明
JTextArea txtArea;

必须写成班级的一个领域;方法初始化只能new JTextArea()分配给它{/ 1}。如果它是方法初始化中的变量,则其可见性仅限于该方法的块。它的生活&#34;通过将其传递到框架的内容窗格中来保存 - 这是GUITest类的字段。

现在,如果您更正并在方法txtOutput.setText("testing")中取消注释changeText,您将会看到另一个错误:

GUITest.java:85: error: non-static variable txtOutput cannot be referenced from a static context
        txtOutput.setText("testing");
        ^

这是范围和范围的又一章。终身故事。静态方法或字段(&#34;类字段&#34;)对于类中的所有方法都是可见的,但是不允许对&#34;实例字段&#34;进行非限定访问,因为它不可能告诉它属于哪个实例。然而,静态字段是唯一的,属于作为一个单元的类,并且具有最大寿命,即,只要该类在程序中。因此允许反向引用来自非静态方法的静态变量。 (但是这个类中可能有很多对象必须注意它们对该静态变量的常见用法并不会导致痛苦。)

你删除&#34;静态&#34;从方法changeText - 它的工作原理!