gpt4 book ai didi

java - 行选择不随 JTable 中的行移动而移动

转载 作者:行者123 更新时间:2023-11-30 04:23:50 25 4
gpt4 key购买 nike

我有以下代码:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;
import javax.swing.table.DefaultTableModel;

public class NewClass1 extends JFrame {
private JTable table;
private JScrollPane scrollPane;
private DefaultTableModel defaultTableModel;

public NewClass1() {
setLocationByPlatform(true);
setLayout(new BorderLayout());
setPreferredSize(new Dimension(600, 400));
setTitle("Table Issues");
setDefaultCloseOperation(EXIT_ON_CLOSE);

createTableModel();
table = new JTable(defaultTableModel);

scrollPane = new JScrollPane(table);

getContentPane().add(scrollPane, BorderLayout.CENTER);

pack();
}

private void createTableModel() {
Vector cols = new Vector();
cols.add("A");

Vector rows = new Vector();
for (int i = 0; i < 50; i++) {
Vector row = new Vector();
row.add((i + 1) + "");
rows.add(row);
}

defaultTableModel = new DefaultTableModel(rows, cols) {
Class[] types = new Class[]{
String.class
};

@Override
public Class getColumnClass(int columnIndex) {
return types[columnIndex];
}

@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
}

public static void main(String[] args) {
try {
UIManager.setLookAndFeel(new NimbusLookAndFeel());
} catch (Exception e) {
}

final NewClass1 nc = new NewClass1();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
nc.setVisible(true);
}
});

while (true) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
int row = (int) (Math.random() * 50);
int move = (int) (Math.random() * 50);

nc.defaultTableModel.moveRow(row, row, move);
}
});
try{
Thread.sleep(1000);
}catch(Exception e){
}
}
}
}

请运行上面的代码并选择行。

我的问题是行移动,行选择没有移动。它停留在固定位置。假设我选择了列值为 25 的行,则行移动后所选行的列值必须为 25。

请帮我解决这个问题。

我真正的问题是,用户将选择行并单击菜单来执行操作,同时其他线程可能已移动行,并且执行的操作将在实际行之外的其他行上。

最佳答案

最简单的方法是记住 ListSelectionModel 之外的某处选定的行,并在 TableModel 发生变化时调整选择。例如,您可以这样做:

public class NewClass1 extends JFrame {
private JTable table;
private DefaultTableModel defaultTableModel;
private JScrollPane scrollPane;

private class SelectionHelper implements ListSelectionListener, TableModelListener {
private Object selectedRow;

@Override
public void valueChanged(ListSelectionEvent event) {
if (!event.getValueIsAdjusting()) return;
int selectedIndex = table.getSelectedRow();
if (selectedIndex >= 0) {
selectedRow = defaultTableModel.getDataVector().get(selectedIndex);
} else {
selectedRow = null;
}
}

@Override
public void tableChanged(TableModelEvent event) {
if (selectedRow == null) return;
int selectedIndex = defaultTableModel.getDataVector().indexOf(selectedRow);
table.getSelectionModel().setSelectionInterval(selectedIndex, selectedIndex);
}
}

public NewClass1() {
// ...
createTableModel();
table = new JTable(defaultTableModel);

table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
SelectionHelper helper = new SelectionHelper();
table.getModel().addTableModelListener(helper);
table.getSelectionModel().addListSelectionListener(helper);
// ...
}
// ...
}

但请注意,您应该调整此代码以供生产使用,例如在线程安全性或可移植性方面(在内部类中使用 tabledefaultTableModel 属性是不好的风格)。

关于java - 行选择不随 JTable 中的行移动而移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16361603/

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