2012-04-15 6 views
3

두 개의 JPanel을 만들었습니다. 하나의 JPanel에는 노드가있는 JTree가 있습니다. 다른 JPanel에는 SQL로 채워진 JTable이 있습니다. JTable에 대한 필터의 일부를 제공하는 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/)는 JDBC가 필수는 아니지만 +1입니다. – trashgod

답변

1

업데이트 SwingWorker의 인스턴스를 사용하여 JTableTableModel 배경입니다. 더 많은 예제는 herehere입니다.

관련 문제