簡體   English   中英

具有現有TableModel的不可編輯JTable

[英]Non editable JTable with existing TableModel

我知道我可以通過覆蓋isCellEditable()函數使JTable不可編輯:

DefaultTableModel tableModel = new DefaultTableModel() {
    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

但我正在使用別人的類(我無法改變)為我生成TableModel。

有沒有其他方法可以實現不可編輯的JTable?

編輯:

我想要不可編輯的JTable,但我想保持行選擇(突出顯示整行)

編輯2:

這是適合我的代碼:

table.setModel(DbUtils.resultSetToTableModel(rs));

for (Class c: Arrays.asList(Object.class, Number.class, Boolean.class)) {
    TableCellEditor ce = table.getDefaultEditor(c);
    if (ce instanceof DefaultCellEditor) {
            ((DefaultCellEditor) ce).setClickCountToStart(Integer.MAX_VALUE);
    }
}

有沒有其他方法可以實現不可編輯的JTable?

覆蓋JTableisCellEditable(...) method

JTable table = new JTable( tableModel )
{
    @Override
    public boolean isCellEditable(int row, int column)
    {
        return false;
    }
};

JTable API可以看出,有幾種方法可用於控制表的選擇行為:

setCellSelectionEnabled(boolean cellSelectionEnabled);
setColumnSelectionAllowed(boolean val);
setRowSelectionAllowed(boolean rowSelectionAllowed);

您可以查找具體描述,以查看是否可以通過這些描述實現所需。 從同一個API中也可以看出JTable繼承了該方法

setEnabled(boolean enabled);

描述為設置是否啟用此組件。 啟用的組件可能會響應用戶輸入,而未啟用的組件則無法響應用戶輸入。 某些組件在被禁用時可能會改變其可視化表示,以便向用戶提供他們無法接受輸入的反饋。

此外,如果您無法更改模型類,但不強制使用精確模型,則可以創建一個從其中擴展的新類,該類將覆蓋isCellEditable方法並將此模型設置為表。

這是另一種方法:

  • table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE)
  • 禁用startEditing操作
  • DefaultCellEditor#setClickCountToStart(Integer.MAX_VALUE)
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class NonEditableButKeepRowSelectionTableTest {
  public JComponent makeUI() {
    String[] columnNames = {"String", "Integer", "Boolean"};
    Object[][] data = {
      {"aaa", 12, true}, {"bbb", 5, false},
      {"CCC", 92, true}, {"DDD", 0, false}
    };
    DefaultTableModel model = new DefaultTableModel(data, columnNames) {
      @Override public Class<?> getColumnClass(int column) {
        return getValueAt(0, column).getClass();
      }
    };
    JTable table = new JTable(model);
    //table.setEnabled(false);

    table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);

    table.getActionMap().put("none", new AbstractAction() {
      @Override public void actionPerformed(ActionEvent e) {
        System.out.println("dummy");
      }
    });
    table.getInputMap().put(KeyStroke.getKeyStroke("pressed F2"), "none");

    for (Class c: Arrays.asList(Object.class, Number.class, Boolean.class)) {
      //TEST: table.setDefaultEditor(c, null);
      TableCellEditor ce = table.getDefaultEditor(c);
      if (ce instanceof DefaultCellEditor) {
        ((DefaultCellEditor) ce).setClickCountToStart(Integer.MAX_VALUE);
      }
    }
    JPanel p = new JPanel(new BorderLayout());
    p.add(new JScrollPane(table));
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new NonEditableButKeepRowSelectionTableTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM