2017-01-26 7 views
0

GUIで2つのjComboBoxを使用する単純なデータベースアプリケーションを設計しています。最初のjComboBoxには、SQLクエリの結果が格納されます。 2番目のjComboBoxに、最初のボックスにユーザーが選択した値を組み込んだ2番目のクエリの結果を入力するようにしたいが、それを正常に動作させることはできない。選択したJComboBoxの値を取得し、2番目のJComboBoxのSQLクエリに追加します。

私は2つのクラスを作成しました.1つはGUIを描画し、mainメソッドを含み、もう1つはクラスをクエリします。

私のGUIクラス:

public class TestUI extends javax.swing.JFrame { 
    // Create new form TestUI 
    public TestUI() { 
     initComponents(); 
    } 

    @SuppressWarnings("unchecked") 

    private void initComponents() { 

     jPanel1 = new javax.swing.JPanel(); 
     jComboBox1 = new javax.swing.JComboBox<>(); 
     jTextField1 = new javax.swing.JTextField(); 
     jComboBox2 = new javax.swing.JComboBox<>(); 
     jButton1 = new javax.swing.JButton(); 
     jButton2 = new javax.swing.JButton(); 
     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     // Combo box 1 population 

     jComboBox1.removeAllItems(); 
     createConnection c1 = new createConnection(); 
     c1.getEmployee().forEach((employee) -> { 
      jComboBox1.addItem(employee); 
     }); 
     jComboBox1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jComboBox1ActionPerformed(evt); 
      } 
     }); 

     // ComboBox 2 population 

     jComboBox2.removeAllItems(); 


    }      

    private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {           
     // TODO add handling code here: 
    }          

    public static void main(String args[]) { 
     DRAW GUI 
    } 
} 

そして、私のデータベースクラス:私はDB接続変数およびGUI座標などのように

を無関係なコードを残している

import java.util.List; 
import java.util.ArrayList; 
import java.sql.*; 

public class createConnection { 

    String empName; 

    public Connection createConnection() { 
     try { 
      Class.forName(driver); 
      java.sql.Connection conn = DriverManager.getConnection(DB_URL, DB_username, DB_password); 
      return conn; 
     } catch (ClassNotFoundException | SQLException e) { 
      return null; 
     } 
    } 

    // ComboBox 1 
    public List<String> getEmployee() { 
     List<String> list = new ArrayList(); 
     Connection conn = createConnection(); 
     try { 
      Statement stmt = conn.createStatement(); 
      String query = "SELECT * FROM hr.employees ORDER BY last_name"; 
      ResultSet results = stmt.executeQuery(query); 
      while (results.next()) { 
       list.add(results.getString("last_name")); 
      } 
     } catch (Exception e) { 
      System.out.println("Exception = " + e); 
     } 
     return list; 
    } 

    // Combo Box 2 
    public List<String> getEmpLocation() { 
     List<String> list = new ArrayList(); 
     Connection conn = createConnection(); 
     try { 
      Statement stmt = conn.createStatement(); 
      String query = "SELECT country_id FROM hr.location WHERE hr.location.emp_name = " + empName; 
      ResultSet results = stmt.executeQuery(query); 
      while (results.next()) { 
       list.add(results.getString("last_name")); 
      } 
     } catch (Exception e) { 
      System.out.println("Exception = " + e); 
     } 
     return list; 
    }  
} 

私はどのように疑問に思ってデータベースクラスのgetEmpLocation()メソッドを適切に取得して、2番目のComboBoxに移入します。これは、両方のクラスにコードを追加し、変数値を渡すことになりますが、私はそれを理解できません!どんな助けでも大いにここに評価されるでしょう。

+1

[コンボボックスの使い方](https://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html)を見てみると、[' JComboBox#getSelectedItem'](https://docs.oracle.com/javase/8/docs/api/javax/swing/JComboBox.html#getSelectedItem--)。次に、[メソッドまたはコンストラクタへの情報の受け渡し](https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html)、[Prepared Statementsの使用](http:// docs .oracle.com/javase/tutorial/jdbc/basics/prepared.html) – MadProgrammer

+0

および[try-with-resourcesステートメント](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html ) – MadProgrammer

+0

[* Dynamic JComboBoxes *](http://stackoverflow.com/q/3191837/230513)の可能な複製。 – trashgod

答えて

0

最初のJComboBoxの値を選択し、ボタンをクリックして選択したデータを処理し、新しいデータを2番目のJComboBoxに読み込むことを前提としています。この場合

あなたの代わりにあなたのJComboBoxのあなたのJButtonのActionListenerを必要とする:

jButton1.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     selectedName = (String) jComboBox1.getSelectedItem();     
    } 
}); 

ます。また、変数に選択した値を格納する必要があります。 getSelectedItem()メソッドはObjectを返しますので、ケースのStringにキャストする必要があります。我々はボタンにActionListenerを追加するので

あなたが必要といけない、この1:

jComboBox1.addActionListener(new java.awt.event.ActionListener() { 
    public void actionPerformed(java.awt.event.ActionEvent evt) { 
     jComboBox1ActionPerformed(evt); 
    } 
}); 
あなた のcreateConnectionクラスで


(大文字で始めるべき大会のクラス名を命名することによって):

try-with-resourcesステートメントを使用していない場合は、catchブロックの後に接続を閉じる必要があります。

あなたが getEmpLocation()方法にごselectedName変数を渡す必要があり
} finally { 
     if (conn != null) { 
      try { 
       conn.close(); 
      } catch (SQLException ex) { 
       ex.printStackTrace(); 
      } 

     } 
    } 

public List<String> getEmpLocation(String name) { 

あなたが代わりに文のPreparedStatementを使用する必要があります。

String query = "SELECT first_name FROM employees WHERE last_name = ?"; 
PreparedStatement ps = conn.prepareStatement(query); 
ps.setString(1, name);    
ResultSet results = ps.executeQuery(); 

正直に言うと、私は何を知りません選択したクエリで達成したいと考えています。まず、この選択クエリは機能しません。テーブル名はlocationではなくLOCATIONSであり、emp_nameという列はありません。

"SELECT country_id FROM hr.location WHERE hr.location.emp_name = ?" 

あなたは、このようなクエリを使用する必要がある場所を取得したい場合:

"SELECT dep.department_name, loc.city, cou.country_name 
FROM employees emp, departments dep, locations loc, countries cou 
WHERE emp.last_name = ? 
AND emp.department_id = dep.department_id 
AND dep.location_id = loc.location_id 
AND loc.country_id = cou.country_id" 

あなたは部門、都市や国の名前を使用したいのですがどの場所を選択することができます。しかし、私の主な問題は、姓を最初に選択してJComboBoxに入れた場合、データの行が1つしかないため、2番目のJComboBoxを使用する意味がないことです。この問題に反対側からアプローチしましょう。まず場所を選択して従業員を選択するとどうなりますか?それがこの問題を解決する可能性があります。


クイック例: データベースからすべての最初の名前を選択し、その後、あなたは正しい姓を選択することができます。あなたのActionListenerを更新

public List<String> getEmpLastName(String name) { 
     List<String> list = new ArrayList(); 
     Connection conn = createConnection(); 

     try { 
      String query = "SELECT last_name " 
          + "FROM employees " 
          + "WHERE first_name = ?"; 
      PreparedStatement ps = conn.prepareStatement(query); 
      ps.setString(1, name);    
      ResultSet results = ps.executeQuery(); 

      while (results.next()) { 
       list.add(results.getString("last_name")); 
      } 
     } catch (Exception e) { 
      System.out.println("Exception = " + e); 
     } finally { 
      if (conn != null) { 
       try { 
        conn.close(); 
       } catch (SQLException ex) { 
        ex.printStackTrace(); 
       }      
      } 
     } 
     return list; 
    } 

PreparedStatementを使用して最初の名前に基づいて、最後の名前(複数可)を選択
public List<String> getEmpFirstName() { 
     List<String> list = new ArrayList(); 
     Connection conn = createConnection(); 

     try { 
      Statement stmt = conn.createStatement(); 
      String query = "SELECT DISTINCT first_name " 
          + "FROM hr.employees " 
          + "ORDER BY first_name"; 
      ResultSet results = stmt.executeQuery(query); 

      while (results.next()) { 
       list.add(results.getString("first_name")); 
      } 
     } catch (Exception e) { 
      System.out.println("Exception = " + e); 
     } finally { 
      if (conn != null) { 
       try { 
        conn.close(); 
       } catch (SQLException ex) { 
        ex.printStackTrace(); 
       }      
      } 
     } 
     return list; 
    } 

:データベースからすべての最初の名前を選択

jButton1.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       // Store selected value 
       selectedName = (String) jComboBox1.getSelectedItem(); 

       // Create Connection and pass selected value to getEmpLastName 
       createConnection c1 = new createConnection(); 
       names = c1.getEmpLastName(selectedName); 

       // Clear your second comboBox and fill with data 
       jComboBox2.removeAllItems();     
       for (String lastName : names) { 
        jComboBox2.addItem(lastName); 
       }    
      } 
     });  

てみてくださいAlexander、David、James、John、Juliaのような一般的な名前を選択する。

+0

こんにちは、すごく驚くほど深い説明をしてくれてありがとう!まず、私はボタンが2番目のコンボボックスをトリガーすることを望んでいません。私は、2番目のComboBoxをトリガーする1番目のComboBoxの値を選択します。したがって、ユーザはbox1で値を選択し、次にbox2に関連する値が入力されます。 – JamesPy

+0

SQLについて - はい、かなり正しいです。実際に実行したいクエリは実際とはかなり異なります。データの一部はプライベートなので、私はHRスキーマを簡単な例として使用しました。しかし、私は例を急いで、あなたのデモデータの使用ははるかに意味が:)私は思うコンボボックスにアクションリスナーを追加する必要があります。これは、ボタンに使用した方法と同様の方法で行われますか? – JamesPy

+0

そうですね。 JButtonではなくJComboBoxにActionListenerを追加します。 –

関連する問題