【问题标题】:How to implement a JTable selection interacting with a JTable如何实现与 JTable 交互的 JTable 选择
【发布时间】:2013-12-19 01:50:24
【问题描述】:

我要做什么:

我想要两个并排的 JTable,当您在左侧的 JTable 中进行选择时,您会在右侧的 JTable 中看到有关该行的更多详细信息。

我的问题是什么?:

我不知道如何实现这一点。我曾尝试使用 addListSelectionListener,但我不确定如何使用一个表中的侦听器与完全不同的表进行交互。例如,让侦听器将 table2 替换为具有全新数据的新表。

我已经包含了一个 SSCCE,它显示了我所做的事情的要点。我将不胜感激任何帮助,因为我一直在互联网上搜索试图将这个问题拼凑起来。

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;

public class TableInteraction extends JPanel
{
    private JTable table1;
    private JTable table2;

    public TableInteraction()
    {
        super();

        String[][] tableOneData = {{"Kathy", "Smith"}};
        String[][] tableTwoData = {{"Kathy", "Smith"}};
        String[][] tableThreeData = {{"Matt", "Bird"}};

        setLayout(new BorderLayout());
        FirstTableModel model1 = new FirstTableModel(tableOneData);
        table1 = new JTable(model1);
        table1.setPreferredScrollableViewportSize(new Dimension(500,200));
        table1.setFillsViewportHeight(true);
        table1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table1.setRowSelectionInterval(0,0);
        JScrollPane scrollPane1 = new JScrollPane(table1);




        SecondTableModel model2 = new SecondTableModel(tableTwoData);
        table2 = new JTable(model2);
        table2.setPreferredScrollableViewportSize(new Dimension(500,200));
        table2.setFillsViewportHeight(true);
        table2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        JScrollPane scrollPane2 = new JScrollPane(table2);

        table1.getSelectionModel().addListSelectionListener(
                new ListSelectionListener()
                {
                    public void valueChanged(ListSelectionEvent event)
                    {
                        int index = table1.getSelectedRow();
                    }
                });

        add(scrollPane1, BorderLayout.WEST);
        add(scrollPane2, BorderLayout.EAST);
    }

    public class FirstTableModel extends AbstractTableModel
    {
        private String[] columnNames = {"First Name", "Last Name"};
        private String[][] data;

        public FirstTableModel(String[][] data)
        {
            this.data = data;
        }

         public int getColumnCount() {
             return columnNames.length;
         }

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

         public String getColumnName(int col) {
             return columnNames[col];
         }

         public Object getValueAt(int row, int col) {
             return data[row][col];
         }
    }

    public class SecondTableModel extends AbstractTableModel
    {
        private String[] columnNames = {"First Name", "Last Name"};
        private String[][] data;

        public SecondTableModel(String[][] data)
        {
            this.data = data;
        }

         public int getColumnCount() {
             return columnNames.length;
         }

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

         public String getColumnName(int col) {
             return columnNames[col];
         }

         public Object getValueAt(int row, int col) {
             return data[row][col];
         }
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("TableFilterDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        TableInteraction newContentPane = new TableInteraction();
        newContentPane.setOpaque(true);
        frame.setContentPane(newContentPane);

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

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

【问题讨论】:

  • "interact" 是什么意思?你想发生什么?
  • 在您的代码中,我并没有真正看到创建自定义 TableModel 的意义。使用 DefaultTableModel,它会提供比您的 TableModels 更多的选项。您可以执行 removeRow、removeColumn 之类的操作。因此,从一个表中触发了一个事件,您可以在另一个表模型上执行某些操作。
  • 对不起,我太含糊了。我稍微编辑了我的代码,以更好地传达我想要做的事情。我为第一个表设置了一个侦听器,在该侦听器中,我希望它能够完全重新制作第二个表并替换它。我会考虑将它们更改为默认值,我正在遵循一个示例,并认为将其保留为自定义可能会更好。
  • DefaultTableModel 有更多方法可以用来操作表格。

标签: java swing jtable


【解决方案1】:

考虑一下(我的评论的扩展)

private String[] columnNames1 = {"First Name", "Last Name"};
private String[][] data1 = {{"Kathy", "Smith"},{"John","Doe"}};

private String[] columnNames2 = {"First Name", "Last Name"};
private String[][] data2 = {{"Kathy", "Smith"},{"John","Doe"}};

DefaultTableModel tableModel1 = new DefaultTableModel(data1, columnNames1);
DefaultTableModel tableModel2 = new DefaultTableModel(data2, columnNames2);

JTable jTable1 = new JTable(tableModel1);
JTable jTable2 = new JTable(tableModel1);

jTable1.getSelectionModel().addListSelectionListener(
                                   new ListSelectionListener()
{
     public void valueChanged(ListSelectionEvent event)
     {
          int index = jTable1.getSelectedRow();
          jTable2.removeRow(index);             

     }
});

选择从表1的行时,删除表2的相同行。这是一个奇怪的例子,如果没有一些空值检查就无法工作,但它展示了两个表如何使用表模型进行交互

编辑:OP 添加评论

如果你想根据第一个表设置第二个表,你可以这样做

jTable2.setModel(jTable1.getModel());

此外,您应该在创建表和模型之后放置您的侦听器,以便您可以使用模型。如果它们还没有被声明,你不能在监听器中使用它们,除非它们被声明为全局

【讨论】:

  • 啊,是的,谢谢!但是 setTableModel 不适用于我正在从事的项目,但 setModel 可以。可能是因为我有自定义类而不是默认类。感谢您的帮助。
猜你喜欢
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
相关资源
最近更新 更多