如何将JComboBox事件处理程序的String转换为查询变量?

时间:2014-01-11 18:43:27

标签: java swing jdbc jcombobox

在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);
  }

2 个答案:

答案 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...

} }