2012-04-15 18 views
3

私は2つのJPanelを作成しました。 1つのJPanelにはノードを持つJTreeがあります。もう一方のJPanelには、SQLで埋められたJTableがあります。私はJTreeのフィルタの一部を提供するJTreeからの入力でJTableのためのクエリを再実行するためにJTreeからノード選択を取得しようとしています。指導をお願いしますか?私はJavaが初めてです。あなたのTreeSelectionListener他のコンポーネントのリスナーからJTableのテーブルモデルを設定するにはどうすればよいですか?

import java.awt.BorderLayout; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Hashtable; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JSplitPane; 
import javax.swing.JTable; 
import javax.swing.JTree; 
import javax.swing.ScrollPaneConstants; 
import javax.swing.event.TreeSelectionEvent; 
import javax.swing.event.TreeSelectionListener; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.TreeSelectionModel; 

public class SCCEEforTreeAndTableInteraction { 

    private static Connection conn = null; 
    private static Statement stmt = null; 
    private static ResultSet rs = null; 
    private static ResultSetMetaData meta; 
    private static int columnCount = 0; 
    private static int rowCount = 0; 
    private static Object[][] result; 
    private static String[] columnNames; 
    private static JTree tree; 
    public static Hashtable<Object, Integer> treeData; 
    public int tableTopicNodeID; 

    public static void main(String[] args) { 

     //Create and setup window 
     JFrame frame = new JFrame("Tree and Table Interaction"); 
     JPanel panelMain = new JPanel(new BorderLayout()); 
     JPanel treePanel = new JPanel(new BorderLayout()); 
     JPanel tablePanel = new JPanel(new BorderLayout()); 
     JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, treePanel, tablePanel); 
     split.setOneTouchExpandable(true); 
     myJTree tree = new myJTree(); 
     myJTable table = new myJTable(); 
     frame.add(panelMain); 
     treePanel.add(tree); 
     tablePanel.add(table); 
     panelMain.add(split); 
     frame.setVisible(true); 
     panelMain.setVisible(true); 
     treePanel.setVisible(true); 
     tablePanel.setVisible(true); 
     frame.pack(); 

    } 

    private static class myJTable extends JPanel { 
     //Getting the data from the database in order to fill the table 
     public myJTable() { 
      try { 
       conn = DriverManager.getConnection("jdbc:derby://localhost:1527/FlamingDartDB;create=true;user=user;password=password"); 
       stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 

       rs = stmt.executeQuery("select count(*) from FLAMINGDART.TOPICDATA where NODEID =" + *Start with a default, then get data from the listener below*); //NodeID should be different every time I select a node 
       rs.beforeFirst(); 
       while (rs.next()) { 
        rowCount = rs.getInt(1); 
       } 
       rs = stmt.executeQuery("select * from FLAMINGDART.TOPICDATA where NODEID =3");//NodeID should be different every time I select a node 
       meta = rs.getMetaData(); 
       columnCount = meta.getColumnCount(); //The first 2 column are not for display to the user 
       columnNames = new String[columnCount]; 
       for (int i = 0; i < columnCount; i++) { 
        columnNames[i] = meta.getColumnName(i + 1); 
       } 
       result = new Object[rowCount][columnCount]; 
       rs.beforeFirst(); 
       for (int i = 0; i < rowCount; i++) { 
        rs.next(); 
        for (int j = 0; j < columnCount; j++) { 
         result[i][j] = rs.getObject(j + 1); 
        } 
       } 
       stmt.close(); 
       conn.close(); 
      } catch (SQLException sqlExcept) { 
       sqlExcept.printStackTrace(); 
      } 
      DefaultTableModel tableModel = new DefaultTableModel(result, columnNames); 
      JTable table = new JTable(tableModel); 
      JScrollPane topicTableScrollPane = new JScrollPane(table); 
      topicTableScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 
      add(topicTableScrollPane); 
     } 
    } 

    private static class myJTree extends JPanel implements TreeSelectionListener { 

     public myJTree() { 
      //This is sample tree data with the node ID that is used to refine the table query. 
      treeData = new Hashtable(); 
      treeData.put("Node 1", new Integer(1)); 
      treeData.put("Node 2", new Integer(2)); 
      treeData.put("Node 3", new Integer(3)); 
      treeData.put("Node 4", new Integer(4)); 
      treeData.put("Node 5", new Integer(5)); 
      treeData.put("Node 6", new Integer(6)); 
      treeData.put("Node 7", new Integer(7)); 
      treeData.put("Node 8", new Integer(8)); 
      treeData.put("Node 9", new Integer(9)); 
      tree = new JTree(treeData); 
      tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 
      tree.addTreeSelectionListener(this); 
      this.add(tree); 
     } 

     @Override 
     public void valueChanged(TreeSelectionEvent tse) { 
      DefaultMutableTreeNode nodeSelected = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); 
      if (nodeSelected == null) //Nothing is selected.  
      { 
       System.out.println("Selected Node is Null"); 
       return; 
      } 
      Integer n = treeData.get(nodeSelected.getUserObject());//Returns the integer value associated with the key from the node table 
      if (n != null) { 
       System.out.println("Start a new query with " + n + " as a filter for the query."); 
*//This is supposed to set the node id that helps populate the table with a new query. Something along the lines of table.SetTableModel(n) that I'm having trouble implementing.* 
      } 
     } 
    } 
} 
+0

[sscce](http://sscce.org/)では+1ですが、JDBCは必須ではありません。 – trashgod

答えて

1

、あなたのJTable年代を背景にTableModelを更新するSwingWorkerのインスタンスを使用します。ここでは、質問のためのコードです。より多くの例は、herehereと見なされます。

関連する問題