0

编辑:谢谢你的所有答案,真的有很多帮助和一些很好的提示。

大家好,我是新来的Java 编程新手,所以我会尽力提供任何相关信息。

我的问题是我正在尝试创建两个类,第一个类(ClassA)是一个 GUI,第二个(ClassB)是(ClassA)的逻辑。

我的代码的一个简单示例是:-

A类

import javax.swing.*;
import java.awt.*;

public class ClassA extends JFrame {


JTextField a = new JTextField();

JButton but = new JButton("Click");

ClassB cb = new ClassB();


public ClassA() {
    setTitle("Test");
    setLookAndFeel();
    setSize(250, 100);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridLayout mainGrid = new GridLayout(1, 1, 20, 20);
    setLayout(mainGrid);


    add(a);
    add(but);
    but.addActionListener(cb);
    setVisible(true);
}


private void setLookAndFeel() {
    try {
        UIManager.setLookAndFeel(
                "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
                );
    } catch (Exception exc) {
        //ignore error
    }
}

public static void main(String[] args) {
    ClassA Alch = new ClassA();
}

}

B类

import java.awt.event.*;

public class ClassB implements ActionListener{
String command;
String text;

ClassA ca;



@Override
public void actionPerformed(ActionEvent event) {
    command = event.getActionCommand();
    if (command.equals("Click")) {
        text = ca.a.getText();
        System.out.println(text);
    }

}
}

我遇到的问题是让 ClassB 读取 JTextField a

如果我删除线

text = ca.a.getText();

并使用

System.out.println(command);

它输出 Click 所以其余的代码似乎可以工作,但只要我添加

text = ca.a.getText();

当我使用“单击”按钮时,我得到一个 NullPointerException。

所以问题是我应该如何编写代码让 ClassB 读取 JTextField 并输出它?

4

4 回答 4

1

你有ClassA变量ca,但你还没有初始化它。所以首先你需要初始化ca变量才能使用它。

ClassA ca - new ClassA();

与您的问题无关,但正如您所说,您是 java 新手。永远记住永远不要在逻辑类中拥有接口类的实例变量。这是一个糟糕的设计。

我建议你找到一些关于 MVC 设计模式的好文章,然后再跳回到 OOP。打下坚实的基础总是更好的:)

于 2012-07-18T15:31:33.903 回答
1

ca变量从未初始化。您需要ClassA ca = new ClassA()在您的某处添加类似的东西ClassB- 可能在构造函数中。

澄清编辑

每条评论:

如果变量在构造函数中被初始化,则需要使用ca = new ClassA(),否则变量将仅在构造函数中作用域。因此,例如:

public ClassB() {
    ca = new ClassA();
}

但是,如果您出于某种原因不想添加构造函数,您也可以修改变量的现有声明:

public class ClassB implements ActionListener{
    String command;
    String text;
    ClassA ca = new ClassA();
    ...
}
于 2012-07-18T15:31:42.877 回答
0

首先,您必须在 ClassB 中创建 ClassA 的实例:

ClassA ca = new ClassA();

那么你应该知道 ca 是一个实例变量,如果你不初始化一个实例变量,它会得到空值。

提示:最好将您的实例变量设为私有并通过 getter 和 setter 方法访问它们:

private JTextField txtField1 = new JTextField();

private JButton btnAction1 = new JButton("Click");

private ClassB cb = new ClassB();

public JTextField getTxtField1() {
    return txtField1;
}
于 2012-07-18T15:35:22.637 回答
0

ca您可以通过调用在 ClassA 的构造函数中初始化 ClassB 的字段cb.ca = this,但这有点脏。字段应该几乎总是私有的,即不能从类外部访问。

解决这个问题的最好方法是忘记 ClassB 并使用匿名类来代替它。在 ClassA 的构造函数中添加新的 ActionListener 匿名实现。

but.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent event) {
        command = event.getActionCommand();
        if (command.equals("Click")) {
            String text = a.getText();
            System.out.println(text);
        }
});

或者,您可以将标签作为参数提供给 ClassB 的构造函数并将其保存到(ClassB 的)字段中。

private JTextField field;

public ClassB(JTextField field) {
    this.field = field;
}
于 2012-07-18T15:54:45.743 回答