2012-04-15 9 views
3

Ich habe zwei JPanels erstellt. Ein JPanel hat einen JTree mit Knoten. Der andere JPanel hat eine SQL-gefüllte JTable. Ich versuche, die Knotenauswahl aus dem JTree zu erhalten, um die Abfrage für die JTable mit der Eingabe aus dem JTree erneut auszuführen, die einen Teil des Filters für die JTable bereitstellt. Können Sie bitte eine Anleitung geben? Ich bin neu in Java. Hier ist der Code für die Frage:Wie kann ich das Tabellenmodell für eine JTable aus dem Listener einer anderen Komponente festlegen?

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

+1 für [sscce] (http://sscce.org/), obwohl die JDBC nicht unbedingt erforderlich ist. – trashgod

Antwort

1

In Ihrem TreeSelectionListener, verwenden Sie eine Instanz von SwingWorker auf Ihrem JTable ‚s TableModel im Hintergrund zu aktualisieren. Weitere Beispiele können here und here gefunden werden.

Verwandte Themen