2017-05-17 21 views
0

私は同様のアイテムを見つけましたが、それをどうやって行うのかという概念を理解できません。私は、JTableを含むHealthTrackerというクラスを持っています。それから私はSQLと呼ばれる別のクラスを持っています。これらのメソッドの1つは、populateTableです。私は私のクエリなどを行うことができますが、私はどのように私のSQLクラスからHealthTrackerクラスにあるJTableにアクセスするのか分かりません。ここに私のSQLクラスのコードです。別のクラスからjtableにアクセス

public void populateTable(int qryType){ 
    try{ 
     DefaultTableModel tblModel = new DefaultTableModel(){ 
      @Override 
      public boolean isCellEditable(int row, int column){ 
       return false; 
      } 
     }; 

     Connection dbconn = SQL.dbConn(); 
     Statement stmt = dbconn.createStatement(); 

     String qry = "SELECT * FROM Services"; 
     ResultSet rs = stmt.executeQuery(qry); 

     int numCols = rs.getMetaData().getColumnCount();    
     for (int col = 1; col <= numCols; col++){ 
      tblModel.addColumn(rs.getMetaData().getColumnLabel(col)); 
     } 

     int row = 0; 
     while (rs != null && rs.next()){ 
      tblModel.addRow(new Object[0]); 
      tblModel.setValueAt(rs.getString("ServiceID"), row, 0); 
      tblModel.setValueAt(rs.getString("Institution"), row, 1); 
      tblModel.setValueAt(rs.getString("Comments"), row, 2); 
      row++; 
     } 
     rs.close(); 

     // This is the line that gives me the error 
     HealthTracker.this.tblMain.setModel(tblModel); 

    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

これは素晴らしいですが、他のクラスからもそのJTableにアクセスできる必要があります。このコードは、アプリケーションを最初にロードしてテーブルを初期化するときに発生しますが、ユーザーはデータをフィルタリングできる必要があります。そこで私は別のウィンドウ(SearchRecord.javaクラス)を表示するフィルターボタンを作成しました。そこではユーザーがパラメーターを入力してから「検索」をクリックします。 「検索」ボタンをクリックすると、クエリが実行され、テーブルに新しい結果が再ロードされます。多分これは間違った方法に近づいていますか?

public class SearchRecord { 

    private JFrame frame; 
    private JTextField txtInstitution; 
    private JTextField txtStartDate; 
    private JTextField txtEndDate; 

    // Launch the application 
    public static void searchForm() { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        SearchRecord window = new SearchRecord(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    // Create the application 
    public SearchRecord() { 
     initialize(); 
    } 

    // Initialize the contents of the frame 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 462, 180); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 

     JLabel label = new JLabel("Enter Search Parameters"); 
     label.setHorizontalAlignment(SwingConstants.CENTER); 
     label.setFont(new Font("Tahoma", Font.BOLD, 12)); 
     label.setBounds(10, 11, 414, 14); 
     frame.getContentPane().add(label); 

     JLabel lblInstitution = new JLabel("Institution: "); 
     lblInstitution.setBounds(10, 47, 85, 14); 
     frame.getContentPane().add(lblInstitution); 
     lblInstitution.setHorizontalAlignment(SwingConstants.RIGHT); 
     lblInstitution.setFont(new Font("Tahoma", Font.BOLD, 12)); 

     txtInstitution = new JTextField(); 
     txtInstitution.setBounds(98, 45, 326, 20); 
     frame.getContentPane().add(txtInstitution); 
     txtInstitution.setColumns(10); 

     JLabel lblStartDate = new JLabel("Start Date: "); 
     lblStartDate.setBounds(10, 78, 85, 14); 
     frame.getContentPane().add(lblStartDate); 
     lblStartDate.setHorizontalAlignment(SwingConstants.RIGHT); 
     lblStartDate.setFont(new Font("Tahoma", Font.BOLD, 12)); 

     txtStartDate = new JTextField(); 
     txtStartDate.setBounds(98, 76, 175, 20); 
     frame.getContentPane().add(txtStartDate); 
     txtStartDate.setColumns(10); 

     JButton button = new JButton("..."); 
     button.setBounds(283, 76, 25, 23); 
     frame.getContentPane().add(button); 

     JButton button_1 = new JButton("..."); 
     button_1.setBounds(283, 106, 25, 23); 
     frame.getContentPane().add(button_1); 

     JLabel lblEndDate = new JLabel("End Date: "); 
     lblEndDate.setBounds(10, 109, 85, 14); 
     frame.getContentPane().add(lblEndDate); 
     lblEndDate.setHorizontalAlignment(SwingConstants.RIGHT); 
     lblEndDate.setFont(new Font("Tahoma", Font.BOLD, 12)); 

     txtEndDate = new JTextField(); 
     txtEndDate.setBounds(98, 107, 175, 20); 
     frame.getContentPane().add(txtEndDate); 
     txtEndDate.setColumns(10); 

     JButton btnFind = new JButton("Find"); 
     btnFind.setFont(new Font("Tahoma", Font.BOLD, 12)); 
     btnFind.setBounds(354, 106, 70, 23); 
     frame.getContentPane().add(btnFind); 

     // Find Records 
     btnFind.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       // Gather all the fields from form 
       String[] fields = new String[3]; 
       fields[0] = txtInstitution.getText(); 
       fields[1] = txtStartDate.getText(); 
       fields[2] = txtEndDate.getText(); 

       // Refresh Table w/Filtered Data from DB 
       SQL loadTbl = new SQL(); 
       try{ 
        HealthTracker.this.tblMain.setModel(loadTbl.populateTable(0)); 
       } catch (SQLException e1){ 
        e1.printStackTrace(); 
       }    
      } 
     });  
    } 
} 

答えて

1

は、あなたのpopulateTable方法がTableModelをロードし、むしろこのメソッドは一つの仕事を持っていることを意味JTable

public TableModel populateTable(int qryType) throws SQLException{ 
    DefaultTableModel tblModel = new DefaultTableModel(){ 
     @Override 
     public boolean isCellEditable(int row, int column){ 
      return false; 
     } 
    }; 
    String qry = "SELECT * FROM Services"; 
    try (Connection dbconn = SQL.dbConn(); 
     Statement stmt = dbconn.createStatement(); 
     ResultSet rs = stmt.executeQuery(qry)) { 

     int numCols = rs.getMetaData().getColumnCount();    
     for (int col = 1; col <= numCols; col++){ 
      tblModel.addColumn(rs.getMetaData().getColumnLabel(col)); 
     } 

     int row = 0; 
     while (rs != null && rs.next()){ 
      tblModel.addRow(new Object[0]); 
      tblModel.setValueAt(rs.getString("ServiceID"), row, 0); 
      tblModel.setValueAt(rs.getString("Institution"), row, 1); 
      tblModel.setValueAt(rs.getString("Comments"), row, 2); 
      row++; 
     } 
    } 
    return model; 
} 

のインスタンスにモデルを適用しようと、それを持つよりも、TableModelのインスタンスを返すよう、 それでおしまい。また、いつでも好きなときに呼び出すことができることを意味します

+0

これは素晴らしいですが、他のクラスからそのJTableにアクセスできる必要があります。このコードは、アプリケーションを最初にロードしてテーブルを初期化するときに発生しますが、ユーザーはデータをフィルタリングできる必要があります。そこで私は別のウィンドウ(SearchRecord.javaクラス)を表示するフィルターボタンを作成しました。そこではユーザーがパラメーターを入力してから「検索」をクリックします。 「検索」ボタンをクリックすると、クエリが実行され、テーブルに新しい結果が再ロードされます。多分これは間違った方法に近づいていますか? – Mnk

+0

だから?必要なときにクエリを実行しているクラスの別のインスタンスをロードできないのはなぜですか?しかし、JTableのフィルタリング・サポートを利用することができます。詳細は、[ソートとフィルタリング](https://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting)を参照してください。 – MadProgrammer

+0

私はちょうど私が仕事を追加したそのコードを作ることができないので、私は間違った方法をやっていると思います。私は私の無知をお詫びしますが、これはJavaに関する私の最初のプロジェクトです。私は前にJavaをやったことがない。 – Mnk

関連する問題