- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用复选框(在 JTable
的每一行中)中的值来操作数据。但是,当我第二次单击同一行的复选框时,不会调用监听器 valueChanged
方法。
可以通过从oracle网站下载表示例轻松重现here
尝试单击同一行的复选框两次。当我们第二次单击该复选框时,控制台日志不会发生变化。
解决方案:借助提供的评论和解决方案。使用 TableModelListener 已经达到了我的目的。
最佳答案
Yes . I did tried with the table model listener but it is also behaving in the same manner .
对我有用...
修改TableSelectionDemo
添加 TableModelListener
支持
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Dimension;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
public class TableSelectionDemo extends JPanel
implements ActionListener {
private JTable table;
private JCheckBox rowCheck;
private JCheckBox columnCheck;
private JCheckBox cellCheck;
private ButtonGroup buttonGroup;
private JTextArea output;
public TableSelectionDemo() {
super();
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
TableModel model = new MyTableModel();
model.addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
output.append("Table changed");
output.append("\n");
}
});
table = new JTable(model);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
table.getSelectionModel().addListSelectionListener(new RowListener());
table.getColumnModel().getSelectionModel().
addListSelectionListener(new ColumnListener());
add(new JScrollPane(table));
add(new JLabel("Selection Mode"));
buttonGroup = new ButtonGroup();
addRadio("Multiple Interval Selection").setSelected(true);
addRadio("Single Selection");
addRadio("Single Interval Selection");
add(new JLabel("Selection Options"));
rowCheck = addCheckBox("Row Selection");
rowCheck.setSelected(true);
columnCheck = addCheckBox("Column Selection");
cellCheck = addCheckBox("Cell Selection");
cellCheck.setEnabled(false);
output = new JTextArea(5, 40);
output.setEditable(false);
add(new JScrollPane(output));
}
private JCheckBox addCheckBox(String text) {
JCheckBox checkBox = new JCheckBox(text);
checkBox.addActionListener(this);
add(checkBox);
return checkBox;
}
private JRadioButton addRadio(String text) {
JRadioButton b = new JRadioButton(text);
b.addActionListener(this);
buttonGroup.add(b);
add(b);
return b;
}
public void actionPerformed(ActionEvent event) {
String command = event.getActionCommand();
//Cell selection is disabled in Multiple Interval Selection
//mode. The enabled state of cellCheck is a convenient flag
//for this status.
if ("Row Selection".equals(command)) {
table.setRowSelectionAllowed(rowCheck.isSelected());
//In MIS mode, column selection allowed must be the
//opposite of row selection allowed.
if (!cellCheck.isEnabled()) {
table.setColumnSelectionAllowed(!rowCheck.isSelected());
}
} else if ("Column Selection".equals(command)) {
table.setColumnSelectionAllowed(columnCheck.isSelected());
//In MIS mode, row selection allowed must be the
//opposite of column selection allowed.
if (!cellCheck.isEnabled()) {
table.setRowSelectionAllowed(!columnCheck.isSelected());
}
} else if (command == "Cell Selection") {
table.setCellSelectionEnabled(cellCheck.isSelected());
} else if (command == "Multiple Interval Selection") {
table.setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
//If cell selection is on, turn it off.
if (cellCheck.isSelected()) {
cellCheck.setSelected(false);
table.setCellSelectionEnabled(false);
}
//And don't let it be turned back on.
cellCheck.setEnabled(false);
} else if ("Single Interval Selection".equals(command)) {
table.setSelectionMode(
ListSelectionModel.SINGLE_INTERVAL_SELECTION);
//Cell selection is ok in this mode.
cellCheck.setEnabled(true);
} else if (command == "Single Selection") {
table.setSelectionMode(
ListSelectionModel.SINGLE_SELECTION);
//Cell selection is ok in this mode.
cellCheck.setEnabled(true);
}
//Update checkboxes to reflect selection mode side effects.
rowCheck.setSelected(table.getRowSelectionAllowed());
columnCheck.setSelected(table.getColumnSelectionAllowed());
if (cellCheck.isEnabled()) {
cellCheck.setSelected(table.getCellSelectionEnabled());
}
}
private void outputSelection() {
output.append(String.format("Lead: %d, %d. ",
table.getSelectionModel().getLeadSelectionIndex(),
table.getColumnModel().getSelectionModel().
getLeadSelectionIndex()));
output.append("Rows:");
for (int c : table.getSelectedRows()) {
output.append(String.format(" %d", c));
}
output.append(". Columns:");
for (int c : table.getSelectedColumns()) {
output.append(String.format(" %d", c));
}
output.append(".\n");
}
private class RowListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent event) {
if (event.getValueIsAdjusting()) {
return;
}
output.append("ROW SELECTION EVENT. ");
outputSelection();
}
}
private class ColumnListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent event) {
if (event.getValueIsAdjusting()) {
return;
}
output.append("COLUMN SELECTION EVENT. ");
outputSelection();
}
}
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};
private Object[][] data = {
{"Kathy", "Smith",
"Snowboarding", new Integer(5), new Boolean(false)},
{"John", "Doe",
"Rowing", new Integer(3), new Boolean(true)},
{"Sue", "Black",
"Knitting", new Integer(2), new Boolean(false)},
{"Jane", "White",
"Speed reading", new Integer(20), new Boolean(true)},
{"Joe", "Brown",
"Pool", new Integer(10), new Boolean(false)}
};
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];
}
/*
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/*
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 2) {
return false;
} else {
return true;
}
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
}
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
//Disable boldface controls.
UIManager.put("swing.boldMetal", Boolean.FALSE);
//Create and set up the window.
JFrame frame = new JFrame("TableSelectionDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
TableSelectionDemo newContentPane = new TableSelectionDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
关于java - 在 JTable 中选择单行两次不会第二次调用 ListSelectionListener.valueChanged(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60557795/
我有一个普通的 JTable 和一个 ListSelectionListener。我想它应该可以正常工作,但有一个问题: 我点击表格行 事件触发(方法 valueChanged 启动) 在 value
这是我的代码。当您从左向右选择时出现问题.. import javax.swing.*; import javax.swing.event.*; pub
对于学校项目,我必须在 JList 上使用 ListSelectionListener(LSL)。我知道 LSL 会响应鼠标单击和鼠标释放。但对于该项目,我必须让它响应双击。有没有办法让 LSL 对此
我想要一个 ListSelectionListener 事件来更改 JPanel。我知道它被正确触发,因为打印语句正在工作,但是面板根本没有改变。 DefaultListModel leftList
目前正在开发 Swing 应用程序,我需要使用 ListSelectionListener 来获取 JList 中的当前选定值。我知道如何将它添加到 JList 本身,但是无论我实现什么,编译器都找不
我只是想看看哪个元素被选中,并根据索引更改框架上的其他标签和文本域。我的代码如下: list = new JList(listModel); list.setSelectionMode
我有带有 JList 和 ListSelectionListener 的 Java 类: final JList myList = new JList(); // ... myList.addList
class MyListListener implements ListSelectionListener { public void valueChanged (ListSelectio
例如,我有一个名为 across_list 的 JList,其中包含项目列表,现在我向该 JList 添加一个 ListSelectionListener 考虑这些代码行: class AcrossL
我有 2 个 jlist 和 1 个 jbutton。我想要做的是,当用户选择一个 jlist 中的某些项目,然后单击按钮,一些元素会根据选择出现在另一个 jlist 上。我的问题是 && 条件,因为
我有包含一些行的 Jtable。如果我选择某些行,则每次都会调用 addListSelectionListener(对于每个行选择)。有什么方法可以避免这些多次调用,因为如果我选择 10000 行,它
我使用 ListSelectionListener 来监听 JTable 的选择,以执行与表中所选项目相关的其他任务。但是为什么下面的代码在一开始的一个选择中执行了两次,而在更新该表之后执行了多次?
我有一个包含联系人姓名的 JTable。从该表中选择一行后,第二个表将填充该人的主要电话号码和电子邮件地址。目前,我正在使用自定义 MouseListener 来检查人们何时单击第一个表格中的一行,但
我有一个表,其中包含我输入的所有学生详细信息。它位于我屏幕的左侧。在右侧,我有另一个带有文本字段的面板,它根据表中的选择显示学生详细信息。我们也可以修改这些细节。为了存储修改后的详细信息,我添加了一个
我在 JSplitPane 中有 2 个 DefaultListModel。 JSplitPane 的左侧有 RssChannel 标题。当选择 RssChannel 标题时,RssItem 标题应该
我在我编写的lil应用程序中随机出现了NullPointerException。基本上,它应显示一个数字列表,当选择其中一个数字时,一些详细信息应显示在窗口的其他部分。 当单击按钮添加新数据集时,会打
这里是第一个问题,希望我做得正确。 下面是我的问题的一个最小示例,我很快就提出了代表我的项目的示例。我为包含一些对象的 JList 创建了一个自定义渲染器(在示例中我使用了字符串来进行说明)。我的问题
我编写了一些在 JLabel 上设置图像的代码。 Image 的路径是通过 JList 上所选项目的 getSelectedValue() 方法获取的。 当用户从 JComboBox(即 typeCh
我最近一直在努力解决一个让我抓狂的 Java 问题。我一直在尝试将 Controller 中的 ListSelectionListener 添加到 View 中的 JList,但是当我成功地将监听器附
我有一个家庭作业,我正在构建一个 GUI JPane,它包含其他 JPanes 以允许显示多个对象。我的一位听众遇到编译错误,需要一些帮助来解决这个问题。让我先说一下我们不被允许使用 IDE。 错误是
我是一名优秀的程序员,十分优秀!