【问题标题】:Dynamically Add/Remove Rows from JTable从 JTable 中动态添加/删除行
【发布时间】:2014-08-19 17:28:36
【问题描述】:

我的应用程序中有两个组合框,用于每个 JTable 的行和列。如下图:

我想动态添加和删除每个表中的行和列。我知道我会做类似table.add() 的事情,但是删除呢?例如,如果用户从 Row 组合框中选择 3,它应该添加另一行,但如果用户选择 2 回来怎么办?它应该删除插入的那一行。那我该怎么做呢?

我知道这可能是一个愚蠢的问题,但我是 Swing 的新手,所以人们对我的期望并不高:(

【问题讨论】:

  • 这对你有帮助吗:http://stackoverflow.com/questions/1117888/how-to-remove-a-row-from-jtable
  • 我知道Remove() 方法。但问题是,我怎么知道是选择了 2 还是选择了 3?就像如果 JTable 已经有 2 行,并且用户从组合中选择 3,它应该 Add() 一行,如果用户再次选择 2,它应该 remove() 一行。我该怎么做?

标签: java swing jtable


【解决方案1】:

您似乎想使用组合框来控制表格的尺寸。 JTable 渲染其底层数据模型。在How to Use Tables 中阅读有关表格的更多信息。添加和删​​除行实际上是对数据模型的操作。例如DefaultTableModel 有许多对您的任务有用的方法:addRow()removeRow()getRowCount() 等。

这完全取决于所需的数据和任务。查看这个简单的示例,该示例使用包装 Apache 的 RealMatrix 的自定义表模型。您可以选择所需的任何数据结构。 DefaultTableModel 也很好,可能就足够了。该示例有两个用于调整表格大小的组合框。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;

import org.apache.commons.math3.linear.Array2DRowRealMatrix;
import org.apache.commons.math3.linear.RealMatrix;

public class TestTableDims extends JPanel{
    private MyTableModel model;
    private JTable table;
    private JComboBox rowsCombo;
    private JComboBox columnsCombo;

    public TestTableDims() {
        setLayout(new BorderLayout(5, 5));

        model = new MyTableModel(2, 2);

        JPanel buttonsPanel = new JPanel();
        Integer[] test = {1, 2, 3, 4, 5};
        rowsCombo = new JComboBox(test);
        rowsCombo.setSelectedItem(2);
        rowsCombo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                model.setRows(((Integer)rowsCombo.getSelectedItem()));
            }
        });

        buttonsPanel.add(new JLabel("rows"));
        buttonsPanel.add(rowsCombo);

        columnsCombo = new JComboBox(test);
        columnsCombo.setSelectedItem(2);
        columnsCombo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                model.setColumns(((Integer)columnsCombo.getSelectedItem()));
            }
        });

        buttonsPanel.add(new JLabel("columns"));
        buttonsPanel.add(columnsCombo);
        add(buttonsPanel, BorderLayout.NORTH);

        JTable table = new JTable();
        table.setModel(model);
        add(new JScrollPane(table));
    }

    class MyTableModel extends AbstractTableModel {
        private RealMatrix matrix;

        public MyTableModel(int rows, int columns) {
            matrix = new Array2DRowRealMatrix(rows, columns);
        }

        public void setRows(int rows) {
            matrix = new Array2DRowRealMatrix(rows, matrix.getColumnDimension());
            fireTableStructureChanged();
        }

        public void setColumns(int columns) {
            matrix = new Array2DRowRealMatrix(matrix.getRowDimension(), columns);
            fireTableStructureChanged();
        }

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

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

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

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return Double.class;
        }

        @Override
        public void setValueAt(Object value, int row, int column) {
            matrix.setEntry(row, column, (double)value);
        }

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

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(300, 200);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {   
            public void run() {   
                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationByPlatform(true);

                TestTableDims panel = new TestTableDims();
                frame.add(panel);
                frame.pack();

                frame.setVisible(true);
            }
        });
    }
}

【讨论】:

  • 正是我要找的东西 :) 谢谢伙计!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 2016-11-28
相关资源
最近更新 更多