gpt4 book ai didi

java - 选中时显示 JTable 行的信息

转载 作者:行者123 更新时间:2023-11-30 05:53:23 26 4
gpt4 key购买 nike

如何在选中时显示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("<none>");
} 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 with details on selection

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("<none>");
} 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();
}
});
}
}

关于java - 选中时显示 JTable 行的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10606521/

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