选中时显示JTable行的信息

选中后如何显示JTable行的信息?

我将简要解释一下我要做什么,然后发布我创建的SSCCE,以防我的任何解释令人困惑。

我希望能够单击表格中的任何行并在面板上显示该信息。 我不确定我需要用什么来完成工作。

我想我需要使用:

  • table.getSelectedRow()
  • MouseListener()
  • ListSelectionListener()

我以前没有使用过Listeners,所以我只知道那些阅读文章/文档的人,同时研究我需要做什么来完成这项工作。

我对如何在我的JPanel上显示信息感到有些困惑。 该面板在主类中创建,其中表在其自己的类中创建。

我感谢任何帮助和建议。

示例来源:

 import javax.swing.JFrame; import javax.swing.JSplitPane; import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; 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.DefaultTableModel; import javax.swing.table.TableModel; public class SwingTesting { private final JFrame frame; private final TablePane tablePane; private final JSplitPane splitPane; private final JPanel infoPanel; public SwingTesting() { tablePane = new TablePane(); infoPanel = new JPanel(); frame = new JFrame(); splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tablePane, infoPanel); frame.add(splitPane); frame.pack(); frame.setVisible(true); } class TablePane extends JPanel { private final JTable table; private final TableModel tableModel; private final ListSelectionModel listSelectionModel; public TablePane() { table = new JTable(); tableModel = createTableModel(); table.setModel(tableModel); table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); table.add(table.getTableHeader(), BorderLayout.PAGE_START); table.setFillsViewportHeight(true); listSelectionModel = table.getSelectionModel(); table.setSelectionModel(listSelectionModel); listSelectionModel.addListSelectionListener(new SharedListSelectionHandler()); table.setSelectionModel(listSelectionModel); this.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.NORTHWEST; gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 3; gbc.insets = new Insets(5, 5, 5, 5); gbc.ipadx = 2; gbc.ipady = 2; gbc.weightx = 1; gbc.weighty = 1; this.add(new JScrollPane(table), gbc); } private TableModel createTableModel() { DefaultTableModel model = new DefaultTableModel( new Object[] {"Car", "Color", "Year"}, 0 ){ @Override public boolean isCellEditable(int row, int column) { return false; } }; addTableData(model); return model; } private void addTableData(DefaultTableModel model) { model.addRow(new Object[] {"Nissan", "Black", "2007"}); model.addRow(new Object[] {"Toyota", "Blue", "2012"}); model.addRow(new Object[] {"Chevrolet", "Red", "2009"}); model.addRow(new Object[] {"Scion", "Silver", "2005"}); model.addRow(new Object[] {"Cadilac", "Grey", "2001"}); } class SharedListSelectionHandler implements ListSelectionListener { @Override public void valueChanged(ListSelectionEvent e) { ListSelectionModel lsm = (ListSelectionModel) e.getSource(); String contents = ""; if(lsm.isSelectionEmpty()) { System.out.println(""); } else { int minIndex = lsm.getMinSelectionIndex(); int maxIndex = lsm.getMaxSelectionIndex(); for(int i = minIndex; i <= maxIndex; i++) { if(lsm.isSelectedIndex(i)) { for(int j = 0; j < table.getColumnCount(); j++) { contents += table.getValueAt(i, j) + " "; } } } System.out.println(contents); } } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new SwingTesting(); } }); } } 

这并不像我想要的那样表现。 它打印出双倍的信息。

因此, Chevrolet Red 2009不再是Chevrolet Red 2009 Chevrolet Red 2009 。 最终我想把文本放在JLabel中并将其放在面板上。 请记住,包含JLabel的面板与表不同。

 table.getModel().addTableModelListener(tableModelListener); 

有关详细信息,请参阅TableModel.addTableModelListener(TableModelListener)


基于SSCCE。

GUI,包含选择的详细信息

 import javax.swing.*; import java.awt.*; import javax.swing.event.*; import javax.swing.table.*; public class SwingTesting { private final JFrame frame; private final TablePane tablePane; private final JSplitPane splitPane; private final JPanel infoPanel; JTextField make = new JTextField(9);; JTextField color = new JTextField(7);; JTextField year = new JTextField(4); public SwingTesting() { tablePane = new TablePane(); infoPanel = new JPanel(new FlowLayout(5)); infoPanel.add(new JLabel("Make")); infoPanel.add(make); infoPanel.add(new JLabel("Color")); infoPanel.add(color); infoPanel.add(new JLabel("Year")); infoPanel.add(year); frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tablePane, infoPanel); frame.add(splitPane); frame.pack(); frame.setVisible(true); } class TablePane extends JPanel { private final JTable table; private final TableModel tableModel; private final ListSelectionModel listSelectionModel; private void setFields(int index) { make.setText(table.getValueAt(index, 0).toString()); color.setText(table.getValueAt(index, 1).toString()); year.setText(table.getValueAt(index, 2).toString()); } private void clearFields() { make.setText(""); color.setText(""); year.setText(""); } public TablePane() { table = new JTable(); tableModel = createTableModel(); table.setModel(tableModel); table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); table.add(table.getTableHeader(), BorderLayout.PAGE_START); table.setFillsViewportHeight(true); listSelectionModel = table.getSelectionModel(); table.setSelectionModel(listSelectionModel); listSelectionModel.addListSelectionListener(new SharedListSelectionHandler()); table.setSelectionModel(listSelectionModel); this.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.NORTHWEST; gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.gridy = 0; gbc.gridheight = 1; gbc.gridwidth = 3; gbc.insets = new Insets(5, 5, 5, 5); gbc.ipadx = 2; gbc.ipady = 2; gbc.weightx = 1; gbc.weighty = 1; this.add(new JScrollPane(table), gbc); } private TableModel createTableModel() { DefaultTableModel model = new DefaultTableModel( new Object[] {"Car", "Color", "Year"}, 0 ){ @Override public boolean isCellEditable(int row, int column) { return false; } }; addTableData(model); return model; } private void addTableData(DefaultTableModel model) { model.addRow(new Object[] {"Nissan", "Black", "2007"}); model.addRow(new Object[] {"Toyota", "Blue", "2012"}); model.addRow(new Object[] {"Chevrolet", "Red", "2009"}); model.addRow(new Object[] {"Scion", "Silver", "2005"}); model.addRow(new Object[] {"Cadilac", "Grey", "2001"}); } class SharedListSelectionHandler implements ListSelectionListener { @Override public void valueChanged(ListSelectionEvent e) { ListSelectionModel lsm = (ListSelectionModel) e.getSource(); String contents = ""; if(lsm.isSelectionEmpty()) { System.out.println(""); } else { int minIndex = lsm.getMinSelectionIndex(); int maxIndex = lsm.getMaxSelectionIndex(); if (minIndex==maxIndex) { setFields(minIndex); } else { clearFields(); for(int i = minIndex; i <= maxIndex; i++) { if(lsm.isSelectedIndex(i)) { for(int j = 0; j < table.getColumnCount(); j++) { contents += table.getValueAt(i, j) + " "; } } } System.out.println(contents); } } } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new SwingTesting(); } }); } } 

我会用的

  • table.getSelectedRow()可以是安全的,直到/没有实现RowSorterRowFilter ,否则你必须convertViewToModel

  • JToolTip MouseListener

  • ListSelectionListener()是直接的方法,但是

a) setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);

b)测试row > -1 ,否则没有选择任何行

c)然后没有理由思考或减少I would prefer to have double/multi click disabled.

  • frame.getContentPane().add(splitPane); 不需要使用Java5中的ContentPane

  • 新的SwingTesting(); 请阅读初始线程

编辑:

如何在这里 , 这里或顶部的例子使用ListSelectionListener 在 这里

我认为使用自定义MouseListener并不像使用可以在每行的单独列上呈现JButton的特殊ButtonColumn那样可行,您只需要为JButton定义一个公共的ActionListener

可在此处找到更多信息: 表按钮列