2016-11-04 111 views
0

非常感謝您的幫助。 :) 我想添加一個複選框列到連接到數據庫的JTable。但是,我認爲我錯過了一些東西,因爲有趣的是這兩件事都起作用(複選框和從數據庫中提取數據),但不是當它們在一起時!請讓我解釋一下我迄今所做的:我做 第一件事是覆蓋在我的默認的表模型這個類:如何在JTable上有複選框列時檢索數據?

data = new Object[100][10]; 
    defaultModel = new DefaultTableModel(data, columnNames) { 

     @Override 
     public Class<?> getColumnClass(int col) { 
      switch(col) { 
      case 0: 
       return Integer.class; 
      case 1: 
       return Integer.class; 
      case 2: 
       return Date.class; 
      case 3: 
       return String.class; 
      case 4: 
       return String.class; 
      case 5: 
       return Boolean.class; 
      default: 
       return null; 
      } 
     } 


    }; 

    table = new JTable(defaultModel); 
    js = new JScrollPane(table); 
    paneLeft.add(js, BorderLayout.CENTER); 

這就是我正在嘗試來填充我的表的複選框:

/* My global variables for this part of the code: 
String query; 
    Statement stmt; 
    ResultSet rs; 
    DefaultTableModel defaultModel; 
    String[] columnNames = {"id","pat_id","date","time", "note", "status"}; 
*/ 



public void placeContentIntoRows(){ 
     stmt = null; 
     rs = null; 
     query = "select * from messages"; 

     try { 
      stmt = TableConnection.dbConnector().createStatement(); 
      if (stmt.execute(query)) { 
       rs = stmt.getResultSet(); 
      } 

      int rowCounter = 0; 

      while(rs.next()){ 
       data[rowCounter][0] = rs.getInt(1 
       data[rowCounter][1] = rs.getInt(2); 
       data[rowCounter][2] = rs.getDate("3"); //When I add the right name for all the columns, column status loses its checkbox. 
       data[rowCounter][3] = rs.getString(4); 
       data[rowCounter][4] = rs.getString(5); 
       data[rowCounter][5] = rs.getBoolean(6); 

       rowCounter++;  
      }   defaultModel = new DefaultTableModel(data, columnNames); 
      table.setModel(defaultModel); 

     } catch (SQLException ex) { 
      System.out.println("SQLException: " + ex.getMessage()); 
     } 

     table.repaint(); 
    } 

您可能能夠看到,我有這樣一段代碼爲列號3: 數據rowCounter = rs.getDate(「3」); 有意添加了引號,以便我可以更充分地解釋我的問題。當引號出現時,這意味着代碼的那部分出現了錯誤,我的表格顯示如下:(沒有數據,但是有複選框)。

複選框顯示

https://i.stack.imgur.com/Ip68h.png

但是,如果我修改代碼的一部分,並採取了引號,是正確的,但沒有複選框顯示我的表!

while(rs.next()){ 
       data[rowCounter][0] = rs.getInt(1); 
       data[rowCounter][1] = rs.getInt(2); 
       data[rowCounter][2] = rs.getDate(3); //When I add the right name for all the columns (id), column status loses its checkbox. 
       data[rowCounter][3] = rs.getString(4); 
       data[rowCounter][4] = rs.getString(5); 
       data[rowCounter][5] = rs.getBoolean(6); 

       rowCounter++;  
      } 

這是我的數據庫表:

  • ID INT,pat_id INT,日期的日期,時間爲varchar(25),記爲varchar(25),狀態 TINYINT(1)

請不要介意變量時間設置爲varchar。只是現在就這樣來解決一個問題。一旦我的這個複選框出現在屏幕上,它會立即改變它。 

如果有人可以請看看我的代碼,並試圖揭示我錯過了什麼,這將是非常感謝的確。這是我第一次使用JTables,所以它可能很簡單,我知道。在這個時刻,我無法找到自己。 非常感謝您的熱心幫助。 :)

PS: That`s my table: 
Field  | Type   | Null | Key | Default | Extra 
------------+---------------+-------------+---------+-------+ 
Id   | int (11)  | NO | Pri | NULL | auto_increment 
Pat_id  | int (11)  | NO   | NULL 
Date  | date   | NO   | NULL  
time  | varchar(25) | YES   | NULL 
note  |varchar(25) | YES   | NULL 
status  |tinyint(1)  | YES   | NULL 

沒有複選框

https://i.stack.imgur.com/ms5Mn.png

方法,其中的問題被發現重構數據:

private void placeContentIntoTable() { 
     PreparedStatement st = null; 
     ResultSet rst = null; 
     try{ 
      String query="SELECT * from messages"; 
      st = TableConnection.dbConnector().prepareStatement(query); 
      if (st.execute()) rst = st.getResultSet(); 

       int rowCounter = 0; 
       data = new Object[1000][10]; 
       //String[] columnNames = {"id","pat_id", "date", "time", "note", "status"}; 
       while(rst.next()){ 
        for(int i=0; i<columnNames.length; i++){ 
         data[rowCounter][i] = rst.getObject(i+1); 
        } 
        rowCounter++;  
       } 

       defaultModel = new DefaultTableModel(data, columnNames);//When it is uncommented we see data but no checkbox, when it is commented out we see the checkboxes but no data 
       table.setModel(defaultModel); 

      } catch (SQLException ex) { 
       System.out.println("SQLException: " + ex.getMessage()); 
      } 

      table.repaint(); 
    } 
+0

你有例外嗎?因爲我認爲你的日期對象是一個字符串,並不是一個真正的日期。所以當表格試圖渲染你的列3時,它會注意到一個錯誤並停止處理其他列(因此你在第6列丟失了複選框)。這可能有所幫助:http://stackoverflow.com/questions/36488426/override-getcolumnclass-not-working-for-date-columns – hamena314

+0

我不明白你目前的問題。請提供[SSCCE](http://sscce.org),而不需要從數據庫獲取檢索數據(例如,使用預定義的二維數組或其他內容)。在這種情況下,我們可能會幫助你。 –

+0

你好,非常感謝你的回覆。我已經添加了我擁有的數據的圖片。我沒有例外,沒有。只能用複選框看不到日期。將布爾值設置爲「true」或「false」,但是當我沒有正確的日期顯示時,我可以看到複選框。 –

回答

1

您的代碼似乎是混亂,因爲你有,你嘗試創建一個DefaultTableModel兩個地方。一旦與自定義getColumnClass(...)方法和其他沒有。

defaultModel = new DefaultTableModel(data, columnNames); 

你只是使用標準的實施DefaultTableModel的。以上代碼不會覆蓋getColumnClass(...)方法,因此將使用默認渲染器,該渲染器只調用列中對象的toString()方法。

+0

您好,非常感謝您的回覆!我認爲我們可能在正確的軌道上找到這裏的問題。 :)閱讀你的回覆後,我注意到,當我註釋掉我的defaultTableModel時,會發生同樣的問題。取消註釋時,數據顯示時不帶複選框,但註釋時不顯示數據,但顯示覆選框。我會將重構的方法添加到我的問題的描述中。你說我的代碼沒有覆蓋getColumnClass(...),你能否更全面地解釋一下這個原因以及我應該怎麼做?謝謝! –

+0

@FrancislainyCampos,我已經給了你理由:'你正在使用默認的渲染器'。如果你想使用不同的渲染器,那麼你需要重寫'getColumnClass(..)。'方法來返回列的類,以便可以使用合適的渲染器。有關更多信息,請閱讀[Concepts:Renderer and Editor](http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender)上的Swing教程部分。 – camickr

+0

再次感謝您找到時間來幫助我。我無法正確獲得的唯一的事實是你說我不覆蓋getColumnClass。我很抱歉,我必須錯過這裏非常明顯的一些東西,因爲如果你可以請再次看看頁面的頂部,那裏有我的問題的描述的開始,我有一段代碼應該重寫getColumnClass中。我在那裏做錯了什麼?我很抱歉,如果我是,並再次感謝你! –

0

圖像2是不可見的,所以我要採取一些猜測...

1)有什麼在thir d列?

2)如果有什麼東西,是否有東西在每一行?

如果其中任何一個問題的答案都是否,請檢查數據的質量,是否有可能「布爾」值不是布爾值,或者整數不是整數,或者不是日期一個日期(解析任何這些類型失敗)。我已經看到這樣的表結構構建好,直到它到達這樣的解析異常,然後一切都停止了,並且由於面向事件的模型構建java表,異常很容易丟失,只是沒有處理,使失敗對你而言不可見。

希望這有助於,

+0

你好,非常感謝你找到時間來幫助我。我已經添加了我擁有的數據的圖片。這當然有幫助,但如果我不能看到,如果我有任何錯誤的數據類型(除了時間的varchar,我正在考慮作爲字符串在Java反正)..再次感謝! :) –

+0

因此,如果這種方法適用於沒有日期的情況,那麼問題很可能就在那裏(如果它像鴨子一樣走路,如果它像鴨子一樣說話,並且它看起來像一隻鴨子......那麼它可能就是一隻鴨子) :)所以現在,將日期列類更改爲String.class,所有應該工作。當你將使用從提取的數據工作的複選框來調整日期時,通過使用 – brou

+0

Oups來修復日期...使用以下命令修復日期: – brou

相關問題