在JCombobox中可能是火车的路线。我想基于事件处理程序获取JCombobox的值,然后在使用数据库的类中使用它。此值将是Mysql查询的参数。我已成功获取它,但无法使用它。我在java方面不是很有经验,我做错了什么。我在网站上搜索过类似的问题,看到了它们但没有清楚地理解它们。我错过了什么?
//imports...
public class Cashier extends JFrame{
//here is main...
public Cashier(){
//some Window code...
final String[] Routes = {"--Select--", "value1",....."valueN" };
final JComboBox comboBox = new JComboBox(Routes);
comboBox.addActionListener(new ActionListener() {
/*-->*/ public String d;
public void WhereTo(String dest){
this.d=dest;
System.out.println(d);
// comes out correct!
/*I want d for use in DBaccess class as query parameter, by invoking
GetRoute()*/
}
public void actionPerformed(ActionEvent e) {
int val = comboBox.getSelectedIndex();
this.d= Routes[val];
WhereTo(d);
}
});
comboBox.setBounds(165, 124, 130, 23);
contentPane.add(comboBox);
//this method will be used by DBaccess
public String GetRoute(){
return d;
}
//More Objects...
}
}
这是我的DBaccess类,我想使用字符串d,可能是通过调用Cashier的Get Route()。
public DBaccess extends Cashier{
//connection code....
// Executing the query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
//probably like this...
String go = Cashier.GetRoute();
sql = "SELECT FROM reservations WHERE destination='"+go+"'";
ResultSet rs = stmt.executeQuery(sql);
}
答案 0 :(得分:2)
下面:
String go = Cashier.GetRoute();
此方法不是静态的,不能以这种方式调用。无论如何,这是一个糟糕的设计选择。考虑为DBaccess
类提供所需路由的setter。 actionPerformed()
实现应如下所示:
@override
public void actionPerformed(ActionEvent e) {
JComboBox comboBox = (JComboBox)e.getSource();
String selectedRoute = (String)comboBox.getSelectedItem();
DBaccess dbAccess = new DBaccess();
dbAccess.setRoute(selectedRoute);
dbAccess.setVisible(true);
}
一些提示可以帮助您:
Cashier extends JFrame
:如果您不添加一些与Swing相关的功能,请不要从swing组件扩展。您可以使用简单的变量。
DBaccess extends Cashier
(从JFrame延伸):一个典型的Swing应用程序应该只有一个JFrame
。您应该使用JDialog代替。请参阅The Use of Multiple JFrames, Good/Bad Practice?
为DBaccess
类提供一种方法,以便从另一个类(Cashier
)设置所需的路径。
您尝试执行的查询容易受到SQL Injection攻击。请查看PreparedStatement以避免这种情况。
如果DBaccess
类将使用Swing组件显示查询结果,那么您可能需要查看SwingWorker类以在后台线程中执行数据库调用并更新Swing组件在Event Dispatch Thread。请查看Concurrency in Swing追踪详情。
答案 1 :(得分:0)
使d成为全局类变量。我的意思是说,在类名后面声明它。
public class Cashier extends JFrame{
private String d;
//here is main...
public Cashier(){
//some Window code...
final String[] Routes = {"--Select--", "value1",....."valueN" };
final JComboBox comboBox = new JComboBox(Routes);
comboBox.addActionListener(new ActionListener() {
/*-->*/ public String d;
public void WhereTo(String dest){
Cashier.this.d=dest; //to change d value
System.out.println(d);
// comes out correct!
/*I want d for use in DBaccess class as query parameter, by invoking
GetRoute()*/
}
public void actionPerformed(ActionEvent e) {
int val = comboBox.getSelectedIndex();
Cashier.this.d= Routes[val]; //to change d value
WhereTo(d);
}
});
comboBox.setBounds(165, 124, 130, 23);
contentPane.add(comboBox);
//此方法将由DBaccess
使用public String GetRoute(){
return d;
}
//More Objects...
} }