gpt4 book ai didi

java - 在单元格选择 jtable 事件之前

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:07:17 24 4
gpt4 key购买 nike

当要选择单元格时是否会触发任何事件?有 ListSelectionListener,但它有仅在选择发生后才触发的事件。我需要一些方法来取消选择事件并使用 ListSelectionListener 这并不容易,因为选择已经发生,我需要一些状态变量来指示选择是正常的还是取消了先前的选择。

有没有办法关闭选择通知?然而,这不是 100% 好的解决方案(如果某些监听器将选择状态保存在其本地存储中,将会出现问题)这总比没有好。

import java.awt.BorderLayout;
import java.awt.EventQueue;

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

public class JTableExample extends JFrame {

/**
*
*/
private static final long serialVersionUID = 6040280633406589974L;
private JPanel contentPane;
private JTable table;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JTableExample frame = new JTableExample();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/
public JTableExample() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);

table = new JTable(new MyTableModel());
ListSelectionModel selectionModel = table.getSelectionModel();
selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
selectionModel.addListSelectionListener(new MySelectionListener());
contentPane.add(table, BorderLayout.CENTER);
}

class MyTableModel extends AbstractTableModel {
/**
*
*/
private static final long serialVersionUID = -8312320171325776638L;

public int getRowCount() {
return 10;
}

public int getColumnCount() {
return 10;
}

public Object getValueAt(int rowIndex, int columnIndex) {
return rowIndex * columnIndex;
}
}

class MySelectionListener implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e) {
int selectedRow = table.getSelectedRow();
if (selectedRow == 5) {
System.out.println("I would like this selection never happened.");
}
}
}

}

最佳答案

无论您想要实现的目标是什么:仅考虑“mouseEvent”是不够的,选择可能会因其他原因而改变(比如键盘输入、编程触发器等)。恢复监听器中未处理的更改不是一种选择:正如您已经指出的那样,这将需要保留选择的副本并且可能会使其他监听器感到困惑。

唯一的方法(我看到的,当然可能是其他方法 ;-) 首先是不要让它发生:实现一个 List SelectionModel,它不会改变选择,如果满足某些条件。我最喜欢的(对我有偏见 :-) 是 VetoableListSelectionModel它是 DefaultListSelectionModel 的一个子类,在 SingleSelectionMode 中,它在实际更改之前等待相关方的否决。

这是使用它的(原始)代码片段:

    VetoableListSelectionModel vetoableSelection = new VetoableListSelectionModel();
VetoableChangeListener navigationController = new VetoableChangeListener() {

public void vetoableChange(PropertyChangeEvent evt)
throws PropertyVetoException {
// custom method that implements your condition
if (!canSelect((int) evt.getOldValue(), (int) evt.getNewValue()))
throw new PropertyVetoException("uncommitted changes",
evt);
}

};
vetoableSelection.addVetoableChangeListener(navigationController);
myTable.setSelectionModel(vetoableSelection);

关于java - 在单元格选择 jtable 事件之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7936064/

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