gpt4 book ai didi

java - 从 JTable 动态添加/删除行

转载 作者:行者123 更新时间:2023-12-01 22:45:50 27 4
gpt4 key购买 nike

我的应用程序中有两个用于每个 JTable 的行和列的组合框。如下所示:enter image description here

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

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

最佳答案

您似乎想使用组合框控制表格的尺寸。 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);
}
});
}
}

关于java - 从 JTable 动态添加/删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25389479/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com