JTable更新ColumnNames

时间:2014-05-16 01:55:52

标签: java swing jtable

我正在使用AbstractTableModel。

我已经使用本网站提供的代码(http://www.javalobby.org/articles/jtable/?source=archives)在JTable到达最后一行时为JTable自动生成新行。

它工作正常但我无法在用户单击按钮时更新列名称。所以我必须删除自动生成行功能来更新列名。

据我了解网站上的代码,它使用隐藏列作为触发器来创建新行。 InteractiveTableModelListener是否禁用某些我不明白如何更改/编辑它的内容?

我怎么解决这个问题?

感谢您的时间!!

1 个答案:

答案 0 :(得分:1)

这是一个简单的例子,说明如何在最后提供"自动添加"功能

基本上,它的作用是映射自定义键绑定以提供自定义键盘导航,在此示例中,这包括 Tab Shift + Tab 输入向上向下,它允许能够确定按下这些键时应该发生什么。

大多数情况下, Tab 输入是最相关的,我只是将其他人添加为例子并保持一致性。

可能稍微有用的功能是提供一个"行工厂"能够为新的空白行生成所需的数据,而不是只插入一堆null,或者至少我觉得它很有用。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;

public class TestTable {

    public static void main(String[] args) {
        new TestTable();
    }

    public TestTable() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                MutableDefaultTableModel model = new MutableDefaultTableModel(4, 4);
                JTable table = new JTable(model);

                KeyStroke tabKey = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
                KeyStroke shiftTabKey = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, KeyEvent.SHIFT_DOWN_MASK);
                KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
                KeyStroke arrowLeftKey = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0);
                KeyStroke arrowRightKey = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0);
                KeyStroke arrowDownKey = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0);
                KeyStroke arrowUpKey = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0);

                InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
                im.put(tabKey, "nextCell");
                im.put(enterKey, "nextCell");
                im.put(arrowRightKey, "nextCell");
                im.put(shiftTabKey, "previousCell");
                im.put(arrowLeftKey, "previousCell");
                im.put(arrowDownKey, "nextRow");
                im.put(arrowUpKey, "previousRow");

                ActionMap am = table.getActionMap();
                am.put("nextCell", new NextCellAction(table, model));
                am.put("previousCell", new PreviousCellAction(table, model));
                am.put("nextRow", new NextRowAction(table, model));
                am.put("previousRow", new PreviousRowAction(table, model));

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MutableDefaultTableModel extends DefaultTableModel implements MutableTableModel {

        public MutableDefaultTableModel(int rows, int cols) {
            super(rows, cols);
        }

        @Override
        public void insertNewRow(int row) {
            Object[] rowData = new Object[getColumnCount()];
            if (row < getRowCount()) {
                insertRow(row, rowData);
            } else {
                addRow(rowData);
            }
        }

    }

    public interface MutableTableModel extends TableModel {

        public void insertNewRow(int row);

    }

    public abstract class AbstractTableAction extends AbstractAction {

        private JTable table;
        private MutableTableModel model;

        private boolean forceStopEditing;

        public AbstractTableAction(JTable table, MutableTableModel model) {
            this.table = table;
            this.model = model;
        }

        public MutableTableModel getModel() {
            return model;
        }

        public JTable getTable() {
            return table;
        }

        public boolean isForceStopEditing() {
            return forceStopEditing;
        }

        public void setForceStopEditing(boolean forceStopEditing) {
            this.forceStopEditing = forceStopEditing;
        }

        public void stopCellEditing() {

            TableCellEditor editor = getTable().getCellEditor();
            if (editor != null) {

                if (!editor.stopCellEditing() && isForceStopEditing()) {

                    editor.cancelCellEditing();

                }

            }

        }

        @Override
        public void actionPerformed(ActionEvent e) {

            JTable table = getTable();

            int row = table.getSelectedRow();
            int col = table.getSelectedColumn();

            int rowCount = table.getRowCount();
            int colCount = table.getColumnCount();

            stopCellEditing();

            int cell[] = updateCellCoordinates(row, col);
            row = cell[0];
            col = cell[1];

            if (col < 0) {
                col = colCount - 1;
                row--;
            } else if (col >= colCount) {
                col = 0;
                row++;
            }

            if (row < 0) {
                row = 0;
            } else if (row >= rowCount) {

                getModel().insertNewRow(row);

            }

            table.setRowSelectionInterval(row, row);
            table.setColumnSelectionInterval(col, col);

        }

        protected abstract int[] updateCellCoordinates(int row, int col);

    }

    public class NextCellAction extends AbstractTableAction {

        public NextCellAction(JTable table, MutableTableModel model) {
            super(table, model);
        }

        @Override
        protected int[] updateCellCoordinates(int row, int col) {
            return new int[]{row, ++col};
        }

    }

    public class PreviousCellAction extends AbstractTableAction {

        public PreviousCellAction(JTable table, MutableTableModel model) {
            super(table, model);
        }

        @Override
        protected int[] updateCellCoordinates(int row, int col) {
            return new int[]{row, --col};
        }

    }

    public class NextRowAction extends AbstractTableAction {

        public NextRowAction(JTable table, MutableTableModel model) {
            super(table, model);
        }

        @Override
        protected int[] updateCellCoordinates(int row, int col) {
            return new int[]{++row, col};
        }

    }

    public class PreviousRowAction extends AbstractTableAction {

        public PreviousRowAction(JTable table, MutableTableModel model) {
            super(table, model);
        }

        @Override
        protected int[] updateCellCoordinates(int row, int col) {
            return new int[]{--row, col};
        }

    }

}