簡體   English   中英

如何強制jTable不可編輯?

[英]How to force jTable to be not editable?

我所知道的,從理論上講,您可以通過創建AbstractTableModel來強制jTable不可編輯,並始終始終返回false來覆蓋以下方法(盡管由於AbstractTableModel的默認方法已經存在,因此這不是必需的)返回false)。

@Override
public boolean isCellEditable(int row, int column) {
   return false;
}

似乎我仍然不知道如何使此代碼適合我的代碼。 我究竟做錯了什么? 這是我的代碼:

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class Datagrid extends AbstractTableModel {
    private static final long serialVersionUID = -1080095595481949205L;
    private String[] title;
    private String[][] data;
    private JTable table;
    private JFrame frm;

    public Datagrid(String[] title, String[][] data) {
        this.title = title;
        this.data = data;

        create_table();
    }

    public JTable getTable() {
        return table;
    }

    private void create_table() {
        table = new JTable(data, title);

        frm = new JFrame();
        frm.getContentPane().add(new JScrollPane(table));
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.pack();
        frm.setVisible(true);
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    @Override
    public int getColumnCount() {
        return table.getColumnCount();
    }

    @Override
    public int getRowCount() {
        return table.getRowCount();
    }

    @Override
    public Object getValueAt(int row, int column) {
        return table.getValueAt(row, column);
    }

}

首先,不要在模型中創建UI元素。

其次,不要從事件調度線程之外創建UI元素

第三(如古巴人所指出的),您尚未將模型應用於表格...

public static void main(String args[]) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            TableModel model = new Datagrid(); // <-- Create a new instance of the model
            table = new JTable(model);         // <-- Apply it to the table..

            frm = new JFrame();
            frm.getContentPane().add(new JScrollPane(table));
            frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frm.pack();
            frm.setVisible(true);
        }
    });
}

古巴着火了...

第四,以下將使您的程序崩潰。 這些方法由表調用,以便它顯示如何配置自身。

public int getColumnCount() {
    return table.getColumnCount();
}

@Override
public int getRowCount() {
    return table.getRowCount();
}

@Override
public Object getValueAt(int row, int column) {
    return table.getValueAt(row, column);
}

您應該引用您要建模的內部數據結構。

您可能會發現通讀如何使用表格會有所幫助

  • 不是isCellEditable的答案,要從AbstractTableModel刪除

public JTable getTable() {
    return table;
}

private void create_table() {
    table = new JTable(data, title);

    frm = new JFrame();
    frm.getContentPane().add(new JScrollPane(table));
    frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frm.pack();
    frm.setVisible(true);
}
  • 分開的視圖和模型邏輯

  • 這種形式(缺少addremove row, setValueAt(...) )無法存儲從JTables視圖到AbstractTableModel任何更改

  • 想念那里ColumnClass

  • JTable視圖的所有數據都存儲在XxxTableModel

  • API中已實現方法的非常正確的AbstractTableModelObject[] / Double[] / String[] ...和Vector<Object> / Vector<String> ...)

您在這里遇到幾個問題:

  1. 您尚未將表模型設置為JTable。
  2. 如果設置表模型,則會得到StackOverflowError ,因為調用table.getRowCount()會調用getModel().getRowCount()
  3. 如果設置表模型,則不會獲得構造函數中指定的列標題。 有關詳細信息,請參見方法AbstractTableModel#getColumnName(int)的 javadoc。

這是基於您的代碼的可運行且可行的解決方案:

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class Datagrid extends AbstractTableModel {
    private static final long serialVersionUID = -1080095595481949205L;
    private String[] title;
    private String[][] data;
    private JTable table;
    private JFrame frm;

    public Datagrid(String[] title, String[][] data) {
        this.title = title;
        this.data = data;

        create_table();
    }

    public static void main(String[] args) {
        String[] columnTitles = {"Title 1", "Title 2"};
        String[][] tableData = {{"Value 1", "Value 2"}, {"Another Value 1", "Another Value 2"}};
        new Datagrid(columnTitles, tableData);
    }

    public JTable getTable() {
        return table;
    }

    private void create_table() {
        table = new JTable(data, title);
        table.setModel(this);
        frm = new JFrame();
        frm.getContentPane().add(new JScrollPane(table));
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.pack();
        frm.setVisible(true);
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    @Override
    public int getColumnCount() {
        return title.length;
    }

    @Override
    public int getRowCount() {
        return data.length;
    }

    @Override
    public Object getValueAt(int row, int column) {
        return data[row][column];
    }

    @Override
    public String getColumnName(int column) {
        return title[column];
    }

}

暫無
暫無

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

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