2014-01-11 2 views
0

В JCombobox возможны маршруты для train.I хочу получить значение JCombobox на основе обработчика событий, а затем использовать его в классе, который использует базу данных. Это значение будет параметром для запроса Mysql. Мне удалось его получить, но он не может его использовать. Я не очень разбираюсь в java, я делаю что-то неправильно. Я искал сайт для подобных проблем, видел их, но не понял их ясно. Что мне не хватает?Как перенести строку обработчика события JComboBox в переменную для запроса?

//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 класс, где я хочу использовать строку д, вероятно, вызвав 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); 
    } 
+1

Пожалуйста, постарайтесь описать вашу проблему. Содержит ли ваш код?Это работает? Получает ли это результат? Этот результат отличается от того, что вы ожидали? –

+0

neoprez --- Я объявил, как вы сказали, но также должен был сделать его статическим, в том числе GetRoute. Да, он компилируется, сейчас! но, однако, значение имеет значение null в DBaccess. Невозможно сделать запрос! – KRF

+0

В общем, я пытаюсь передать d на DBaccess, чтобы сделать запрос – KRF

ответ

2

Здесь:

String go = Cashier.GetRoute(); 

Этот метод не является статическим и его нельзя вызвать таким образом. В любом случае это плохой выбор дизайна. Подумайте о том, чтобы обеспечить класс DBaccess с помощью сеттера по желаемому маршруту. 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: не простираются от распашных компонентов, если вы не будете добавлять некоторые связанные Свинг функциональность. Вместо этого вы можете использовать простую переменную.

  • 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 для получения более подробной информации.

+0

dic19 ---- Очень полезно спасибо! – KRF

+0

@KRF приветствую :) – dic19

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

общественности Строка GetRoute() {

return d;      
} 

//More Objects... 

}}

+0

Пришлось изменить его на (private static d) и метод (private static String GetRoute()), нормально. Но тогда у меня есть d, объявленный в ActionListener и статический, нужно связать их каким-то образом ... – KRF

+0

Я пытаюсь найти способ передать d из одного класса в другой, Кассир для DBaccess, чтобы сделать запрос , – KRF

Смежные вопросы