在另一个面板中显示 jtable 并删除一行
displaying jtable in another panel and remove one row
我有一个 jtable
,它显示给第一个 jpanel
,但同时它必须在第二个 jpanel
中再次显示。但我应该先删除 jtable
的最后一行,然后再将其显示到第二 jpanel
。如果我回到第一个 jpanel
,删除的行将返回,并在第二个 jpanel
中再次删除,反之亦然。
这可能吗?当我尝试研究它时,我似乎找不到答案。感谢您的帮助:)
所以,让我看看我是否正确:table 1 和 table 2 将完全相同,只是 table 1 比 [=19 多一行=] 2个对吧?
如果是这样,让它们共享相同的 TableModel,但 table 2 根据 JTable tutorial.
使用行过滤器不显示模型的最后一行
这是我的尝试,但请注意,这是我第一次做这种事情,所以 "caveat emptor":
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;
@SuppressWarnings("serial")
public class ShareTableModel extends JPanel {
private static final Integer[][] DATA = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } ,
{10, 11, 12},
{13, 14, 15}};
private static final String[] COLS = { "A", "B", "C" };
private static final int SPINNER_COUNT = 3;
private DefaultTableModel tblModel = new DefaultTableModel(DATA, COLS);
private JTable table1 = new JTable(tblModel);
private JTable table2 = new JTable(tblModel);
private JSpinner[] spinners = new JSpinner[SPINNER_COUNT];
private MySorter2 sorter = new MySorter2(tblModel);
public ShareTableModel() {
JPanel addRowPanel = new JPanel();
for (int i = 0; i < spinners.length; i++) {
JSpinner spinner = new JSpinner(new SpinnerNumberModel(10, 0, 100, 1));
addRowPanel.add(spinner);
spinners[i] = spinner;
}
addRowPanel.add(new JButton(new AddRowAction("Add Row", KeyEvent.VK_A)));
table2.setRowSorter(sorter);
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.add("Table 1", new JScrollPane(table1));
tabbedPane.add("Table 2", new JScrollPane(table2));
setLayout(new BorderLayout());
add(tabbedPane);
add(addRowPanel, BorderLayout.PAGE_END);
}
private class MySorter2 extends TableRowSorter<DefaultTableModel> {
public MySorter2(DefaultTableModel tableModel) {
super(tableModel);
setRowFilter(new RowFilter<DefaultTableModel, Integer>() {
@Override
public boolean include(RowFilter.Entry<? extends DefaultTableModel, ? extends Integer> entry) {
int modelRow = entry.getIdentifier();
return modelRow < getModelRowCount() - 1;
}
});
}
}
private class AddRowAction extends AbstractAction {
public AddRowAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
Integer[] row = new Integer[spinners.length];
for (int i = 0; i < row.length; i++) {
row[i] = (Integer) spinners[i].getValue();
}
tblModel.addRow(row);
sorter.sort();
}
}
private static void createAndShowGui() {
JFrame frame = new JFrame("ShareTableModel");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ShareTableModel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
我有一个 jtable
,它显示给第一个 jpanel
,但同时它必须在第二个 jpanel
中再次显示。但我应该先删除 jtable
的最后一行,然后再将其显示到第二 jpanel
。如果我回到第一个 jpanel
,删除的行将返回,并在第二个 jpanel
中再次删除,反之亦然。
这可能吗?当我尝试研究它时,我似乎找不到答案。感谢您的帮助:)
所以,让我看看我是否正确:table 1 和 table 2 将完全相同,只是 table 1 比 [=19 多一行=] 2个对吧?
如果是这样,让它们共享相同的 TableModel,但 table 2 根据 JTable tutorial.
使用行过滤器不显示模型的最后一行这是我的尝试,但请注意,这是我第一次做这种事情,所以 "caveat emptor":
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;
@SuppressWarnings("serial")
public class ShareTableModel extends JPanel {
private static final Integer[][] DATA = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } ,
{10, 11, 12},
{13, 14, 15}};
private static final String[] COLS = { "A", "B", "C" };
private static final int SPINNER_COUNT = 3;
private DefaultTableModel tblModel = new DefaultTableModel(DATA, COLS);
private JTable table1 = new JTable(tblModel);
private JTable table2 = new JTable(tblModel);
private JSpinner[] spinners = new JSpinner[SPINNER_COUNT];
private MySorter2 sorter = new MySorter2(tblModel);
public ShareTableModel() {
JPanel addRowPanel = new JPanel();
for (int i = 0; i < spinners.length; i++) {
JSpinner spinner = new JSpinner(new SpinnerNumberModel(10, 0, 100, 1));
addRowPanel.add(spinner);
spinners[i] = spinner;
}
addRowPanel.add(new JButton(new AddRowAction("Add Row", KeyEvent.VK_A)));
table2.setRowSorter(sorter);
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.add("Table 1", new JScrollPane(table1));
tabbedPane.add("Table 2", new JScrollPane(table2));
setLayout(new BorderLayout());
add(tabbedPane);
add(addRowPanel, BorderLayout.PAGE_END);
}
private class MySorter2 extends TableRowSorter<DefaultTableModel> {
public MySorter2(DefaultTableModel tableModel) {
super(tableModel);
setRowFilter(new RowFilter<DefaultTableModel, Integer>() {
@Override
public boolean include(RowFilter.Entry<? extends DefaultTableModel, ? extends Integer> entry) {
int modelRow = entry.getIdentifier();
return modelRow < getModelRowCount() - 1;
}
});
}
}
private class AddRowAction extends AbstractAction {
public AddRowAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
Integer[] row = new Integer[spinners.length];
for (int i = 0; i < row.length; i++) {
row[i] = (Integer) spinners[i].getValue();
}
tblModel.addRow(row);
sorter.sort();
}
}
private static void createAndShowGui() {
JFrame frame = new JFrame("ShareTableModel");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ShareTableModel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}