Java 未找到变量,即使它为';她在上面的班里

Java 未找到变量,即使它为';她在上面的班里,java,variables,if-statement,actionlistener,Java,Variables,If Statement,Actionlistener,我有一个包含JButtons的GUI类,下面有一个actionPerformed类,它显示了如果我按下按钮将会发生什么。现在,当我执行if(e.getSource()==search)时,搜索显示为红色,表示在类GUI中找不到变量。即使是在那个班 我需要一些帮助 package crimedata; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.sql.*; class GUI e

我有一个包含JButtons的GUI类,下面有一个actionPerformed类,它显示了如果我按下按钮将会发生什么。现在,当我执行
if(e.getSource()==search)
时,搜索显示为红色,表示在类GUI中找不到变量。即使是在那个班

我需要一些帮助

package crimedata;

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


class GUI extends JFrame implements ActionListener {

    Connection con = null;

    GUI() {
        JPanel p = new JPanel();
        JFrame f = new JFrame("Crime Data");

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(600, 600);

        f.setResizable(true);
        f.setLocationRelativeTo(null);
        GridBagConstraints gbc = new GridBagConstraints();
        getContentPane().setLayout(new GridBagLayout());

        gbc.insets = new Insets(5, 5, 5, 5);

        JLabel LongLabel = new JLabel("Enter Longitude here");
        LongLabel.setForeground(Color.gray);
        gbc.gridx = 0;
        gbc.gridy = 1;
        getContentPane().add(LongLabel, gbc);
        JTextField LongText = new JTextField(20);
        getContentPane().add(LongText, gbc);

        JLabel LatLabel = new JLabel("Enter Latitude here");
        LatLabel.setForeground(Color.gray);
        gbc.gridx = 0;
        gbc.gridy = 2;
        getContentPane().add(LatLabel, gbc);
        JTextField LatText = new JTextField(20);
        getContentPane().add(LatText, gbc);

        JLabel LSOANameLabel = new JLabel("Enter LSOA Name here");
        LSOANameLabel.setForeground(Color.gray);
        gbc.gridx = 0;
        gbc.gridy = 3;
        getContentPane().add(LSOANameLabel, gbc);
        JTextField LSOANameText = new JTextField(20);
        getContentPane().add(LSOANameText, gbc);

        JButton search = new JButton("Search");
        gbc.gridx = 0;
        gbc.gridy = -1;
        getContentPane().add(search, gbc);
        search.addActionListener(this);

        JButton exportnoid = new JButton("Export No Crime ID");
        gbc.gridx = 0;
        gbc.gridy = -1;
        getContentPane().add(exportnoid, gbc);

        JButton exportdup = new JButton("Export Duplicate ID");
        gbc.gridx = 0;
        gbc.gridy = -1;
        getContentPane().add(exportdup, gbc);

        f.add(getContentPane());
        pack();
        f.setVisible(true);
    }

   @Override
   public void actionPerformed(ActionEvent e) {
      if(e.getSource()==search){
          System.out.println("");
      } else {

      }
   }

}

class GUIHandler {
    public static void main(String[] args) {
        GUI a = new GUI();
    }
}

不,在类
GUI
的范围内没有变量
search

在类的构造函数
GUI
中有一个局部变量
search

到目前为止,我看到的唯一实例变量是
Connection
类型的变量
con

如果您想在另一种方法中使用它,您应该将
search
声明为
GUI
的实例变量,就像
con
。我的建议是,你把它定为私人的


或者您可以使用
setActionCommand(String cmd)
为JButton设置操作命令名。然后您可以使用
ActionEvent
getActionCommand()
检索操作的名称并做出相应的反应。但我不喜欢这种方法,因为在这种情况下,编译器无法帮助您检测名称冲突。

search
变量不是实例变量,它的范围仅限于构造函数,因此您不能在它之外使用它

Connection con=null之后声明
JButton search
变量


还要注意,在
actionPerformed
方法中有空的'else'语句。

类GUI扩展了JFrame实现ActionListener{

Connection con = null;
JButton search;

GUI() {
    JPanel p = new JPanel();
    JFrame f = new JFrame("Crime Data");

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(600, 600);

    f.setResizable(true);
    f.setLocationRelativeTo(null);
    GridBagConstraints gbc = new GridBagConstraints();
    getContentPane().setLayout(new GridBagLayout());

    gbc.insets = new Insets(5, 5, 5, 5);

    JLabel LongLabel = new JLabel("Enter Longitude here");
    LongLabel.setForeground(Color.gray);
    gbc.gridx = 0;
    gbc.gridy = 1;
    getContentPane().add(LongLabel, gbc);
    JTextField LongText = new JTextField(20);
    getContentPane().add(LongText, gbc);

    JLabel LatLabel = new JLabel("Enter Latitude here");
    LatLabel.setForeground(Color.gray);
    gbc.gridx = 0;
    gbc.gridy = 2;
    getContentPane().add(LatLabel, gbc);
    JTextField LatText = new JTextField(20);
    getContentPane().add(LatText, gbc);

    JLabel LSOANameLabel = new JLabel("Enter LSOA Name here");
    LSOANameLabel.setForeground(Color.gray);
    gbc.gridx = 0;
    gbc.gridy = 3;
    getContentPane().add(LSOANameLabel, gbc);
    JTextField LSOANameText = new JTextField(20);
    getContentPane().add(LSOANameText, gbc);
    search = new JButton("Search");
    gbc.gridx = 0;
    gbc.gridy = -1;
    getContentPane().add(search, gbc);
    search.addActionListener(this);

    JButton exportnoid = new JButton("Export No Crime ID");
    gbc.gridx = 0;
    gbc.gridy = -1;
    getContentPane().add(exportnoid, gbc);

    JButton exportdup = new JButton("Export Duplicate ID");
    gbc.gridx = 0;
    gbc.gridy = -1;
    getContentPane().add(exportdup, gbc);

    f.add(getContentPane());
    pack();
    f.setVisible(true);
}

}

看起来
search
对于构造函数是本地的,因此它不是类的成员。请格式化代码。非常感谢。作为对Java的一个完全不了解的人,你能握住我的手,告诉我你说的私有化是什么意思吗?非常感谢!另外,我的意思是符号,而不是变量:/@AadilF1代替编写
Connection con
JButton search
,您可以编写
private Connection conn
(或
private JButton search
)来限制您的类对变量的可见性。否则,它将具有所谓的“默认可见性”。在这里查看更多信息:好的,我应该删除GUI()方法吗?@AadilF1
GUI()
不是一个方法。它是类的构造函数,当对象由
new
(在
new GUI()
中)初始化时,会自动调用它。对于是否应该在构造函数中初始化小部件(如遵循在C++中更流行的RAII习惯用法),还是使用一些单独的
init()
方法,存在不同的意见。但当你更有经验时,你可以开始考虑这些事情。首先,您应该阅读更多关于Java语言和面向对象编程的在线文档私有按钮搜索;现在我没有发现编译器错误,所以我认为这是可行的。@AadilF1很酷,但您的代码有点草率,我知道您刚刚开始使用Java。我建议您阅读Robert C.Martin和Martin Fowler的文章,这将大大提高您的代码构造技能!好的,我刚刚用一个简单的sout(“Hello”)命令运行了它,但它似乎不起作用:/@AadilF1是否删除了构造函数中的搜索声明?您需要将
JButton search
内部的
GUI()
构造函数替换为
search
,否则它会掩盖实例变量。是的,这就是我需要的,非常感谢您的输入!