Java 未找到变量,即使它为';她在上面的班里
我有一个包含JButtons的GUI类,下面有一个actionPerformed类,它显示了如果我按下按钮将会发生什么。现在,当我执行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
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()方法吗?@AadilF1GUI()
不是一个方法。它是类的构造函数,当对象由new
(在new GUI()
中)初始化时,会自动调用它。对于是否应该在构造函数中初始化小部件(如遵循在C++中更流行的RAII习惯用法),还是使用一些单独的init()
方法,存在不同的意见。但当你更有经验时,你可以开始考虑这些事情。首先,您应该阅读更多关于Java语言和面向对象编程的在线文档私有按钮搜索;现在我没有发现编译器错误,所以我认为这是可行的。@AadilF1很酷,但您的代码有点草率,我知道您刚刚开始使用Java。我建议您阅读Robert C.Martin和Martin Fowler的文章,这将大大提高您的代码构造技能!好的,我刚刚用一个简单的sout(“Hello”)命令运行了它,但它似乎不起作用:/@AadilF1是否删除了构造函数中的搜索声明?您需要将JButton search
内部的GUI()
构造函数替换为search
,否则它会掩盖实例变量。是的,这就是我需要的,非常感谢您的输入!