2015-10-04 36 views
-1

我創建了一個類,它可以動態地鎖定和解鎖列。 在我的程序中,我創建了兩個具有相同tablemodel的表格。 一個是在scrollview的Jviewport中,另一個是在RowHeaderView中。 問題是,當您解鎖所有鎖定的列 ,並且您想要再次開始鎖定時,不起作用。沒有錯誤,但它就像事件沒有回答。JTable的動態固定列問題

步驟產生問題:

  1. 嘗試代碼,
  2. 放在固定的表中的所有列,
  3. 然後用右鍵雙擊解鎖,
  4. 然後重新啓動鎖定,並解鎖

做這個程序,你可以看到鼠標事件不再回答

張貼SSCCE時
public class Prova extends JFrame{ 

private JTable mainTable,fixedTable; 
private JScrollPane scrollPane; 
private JTableHeader mainTableHeader; 
private TableColumnModel originalColumnModel,mainColumnModel,fixedColumnModel; 
private TableColumn[] columns; 
private int ncols,counter; 

public Prova(){ 

    counter = 0; 
    TableModel mainTableModel = new DefaultTableModel(5, 10); 
    scrollPane = new JScrollPane(); 
    mainTable = new JTable(mainTableModel); 
    mainColumnModel = mainTable.getColumnModel(); 

    fixedTable = new JTable(); 
    fixedTable.setAutoCreateColumnsFromModel(false); 
    fixedTable.setModel(mainTable.getModel()); 

    ncols = mainTableModel.getColumnCount(); 
    columns = new TableColumn[ncols]; 
    for (int i=0;i<ncols;i++){ 
     columns[i] = mainColumnModel.getColumn(i); 
    } 

    mainColumnModel = mainTable.getColumnModel(); 
    fixedColumnModel = fixedTable.getColumnModel(); 
    mainTableHeader = mainTable.getTableHeader(); 

    mainTableHeader.addMouseListener(new MouseAdapter(){ 
    @Override 
     public void mouseClicked(MouseEvent me){ 
      if (SwingUtilities.isRightMouseButton(me)){ 
       if (ncols - counter>1){ 
        counter ++; 
        int col = mainTable.columnAtPoint(me.getPoint()); 
        TableColumn column = mainColumnModel.getColumn(col); 
        mainColumnModel.removeColumn(column); 
        fixedTable.getColumnModel().addColumn(column); 
        scrollPane.setRowHeaderView(fixedTable); 
        scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable.getTableHeader()); 
       } 
      } 
     } 
    }); 

    fixedTable.getTableHeader().addMouseListener(new MouseAdapter() { 
    @Override 
     public void mouseClicked(MouseEvent me){ 
      if (SwingUtilities.isRightMouseButton(me) && me.getClickCount()== 2){ 

       while (mainColumnModel.getColumnCount() > 0){ 
        mainColumnModel.removeColumn(mainColumnModel.getColumn(0)); 
       } 

       while (fixedColumnModel.getColumnCount() > 0){ 
        fixedColumnModel.removeColumn(fixedColumnModel.getColumn(0)); 
       } 

       for(int i=0;i<ncols;i++){ 
        mainColumnModel.addColumn(columns[i]); 
       } 

       scrollPane.setRowHeaderView(null); 
      } 

     } 
    }); 

    scrollPane.setViewportView(mainTable); 
    add(scrollPane, BorderLayout.CENTER); 
    pack(); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLocationRelativeTo(null); 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
@Override 
     public void run() { 
    new Prova().setVisible(true); 
     } 
}); 
} 
} 
+0

你的問題是什麼?此外,儘量減少你的例子:http://stackoverflow.com/help/mcve - 它有助於可讀性,並有助於給出相關的答案 –

+0

這將是很好的檢查由亞當提供的LINK –

+0

'現在它的所有短' - 沒有代碼更糟,因爲我們無法執行代碼,因此我們無法看到問題所在。任何人都無法根據該代碼解決問題。提問時,您需要發佈正確的「SSCCE」。我很幸運,我看到了舊的代碼。閱讀我的答案,提供有關創建更好的SSCCE以及問題答案的提示(無論如何我都瞭解問題)。 – camickr

回答

2

幾個要點:

for (int i=0;i<ncols;i++){ 

不要害怕使用空格在你的代碼,以使其更具可讀性是分離的3個語句for語句。

for (int i = 0; i < ncols; i++){ 

保持代碼的簡單和直接相關的問題:

TableModel mainTableModel = new EmployeeTableModel(listEmployees); 

您的問題是關於「移動列」,不是在表中的數據,所以沒有必要爲一個特殊的TableModel和Employee類。只需使用DefaultTableModel:

TableModel mainTableModel = new DefaultTableModel(5, 10); 

您當前的代碼不會編譯,因爲您沒有包含Employee類。通過使用JDK類,代碼更小,更易於閱讀。

問題是,當你解開所有的鎖定列,並要開始再次鎖定,不工作

你的循環代碼是錯誤的。我懶得弄清楚什麼是錯的。相反,我所做的代碼更簡單:

//for(int i=0;i<(ncols-counter);i++){ 
while (mainColumnModel.getColumnCount() > 0) 
{ 
    mainColumnModel.removeColumn(mainColumnModel.getColumn(0)); 
} 

//for(int i=0;i<counter;i++){ 
while (fixedColumnModel.getColumnCount() > 0) 
{ 
    fixedColumnModel.removeColumn(fixedColumnModel.getColumn(0)); 
} 

另一個問題是,您的固定表沒有頭,所以你不知道列是什麼。

scrollPane.setRowHeaderView(fixedTable); 
scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable.getTableHeader()); 

現在,你有一個頭,你需要到的MouseListener添加到頭,而不是滾動窗格:這是通過使用固定

//scrollPane.addMouseListener(new MouseAdapter() { 
fixedTable.getTableHeader().addMouseListener(new MouseAdapter() { 

編輯:

您也有類似的問題到我上面固定的。當你可以使用組件本身時,不要使用變量來跟蹤值。

if (ncols - counter>1){ 

您從不重置計數器的值,所以if條件將不會在第二次爲真。

正如我上面做只是用從列模型中的價值:

​​

這僅僅是基本的解決問題。在代碼塊中放置一個顯示語句,以查看在遇到問題時它是否執行。

+0

我不知道這意味着什麼。根據我的建議發佈適當的SSCCE。它爲我工作得很好。 – camickr

+0

您沒有更改「for循環」。我正在使用你的代碼得到一個異常。這就是爲什麼我簡化了代碼併發布了我的解決方案。 – camickr

+0

'我沒有導致你的循環不工作 - 這個聲明對我來說沒有任何意義。我不知道你的意思是「沒有工作」。就我而言,它可以正常工作。雙擊時,列將從固定表中刪除,主表現在包含所有列。我不知道你還期望發生什麼?詳細描述您爲解決問題所採取的步驟。把這些信息放在問題中,而不是在這裏發表評論。 – camickr