gpt4 book ai didi

Java Swing JTable - 排序后获得正确的行索引

转载 作者:行者123 更新时间:2023-11-30 10:36:12 32 4
gpt4 key购买 nike

我在 Java 中遇到了一个问题。 Image showing the Problem

问题是:我有一个包含 2 列的 JTable(在图 4 中用于测试目的):一个是复选框,第二个是字符串。每当用户选中一个复选框时,位置列将向上计数,因此第一个选中的复选框将获得位置“1”,第二个选中的复选框将获得位置“2”,依此类推。

当用户 checkout 一个复选框,让我们说 10 个项目中的位置 5 时,位置 6 及以上的行将倒数一个,位置 5 的单元格将设置为空字符串("").

这行得通,但我遇到的问题是:

  1. 用户选中多个复选框,
  2. 然后对表格进行排序
  3. 然后尝试勾选几乎所有复选框

这将导致如图所示的列搞砸。

在我的示例图片中,您还可以看到另外两列:Column Row,在开始时给出,其中 Table 未排序和 Column RowIndexToModel,它显示行的位置但转换为 Vector 内的行,我认为是这样,但似乎并非如此。

这是示例类:

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

@SuppressWarnings("serial")
public class Example extends JFrame {
private JTable tbl;

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Example frame = new Example();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
public Example() {
Object[] colNames = {"Checkbox", "Position"};
Object[][] rows = {{false, ""}, {false, ""},{false, ""},{false, ""},{false, ""},{false, ""},{false, ""}};
DefaultTableModel model = new DefaultTableModel(rows, colNames);
getContentPane().setLayout(new GridBagLayout());

tbl = new JTable(model)
{
@Override
public Class getColumnClass(int column) {
switch (column) {
case 0:
return Boolean.class;
case 1:
return String.class;
default:
return String.class;
}
}
};
tbl.setAutoCreateRowSorter(true);
tbl.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
row = tbl.convertRowIndexToModel(row);
if (e.getColumn() == 0) {
TableModel model = (TableModel) e.getSource();
Boolean checked = (Boolean) model.getValueAt(row, 0);//getting if boolean got checked or not
if (checked) {
int maxCount = 0;
for (int i = 0; i < model.getRowCount(); i++) {
String curValue = (String)model.getValueAt(i, 1);
if(curValue != null && !curValue.equals("") && Integer.valueOf(curValue) > maxCount)
maxCount = Integer.valueOf(curValue); //get highest number in tbl
}
maxCount++;
model.setValueAt(String.valueOf(maxCount),row, 1); //set highest number + 1
} else {
String columnString = (String)model.getValueAt(row, 1); //getting position
int tmpPos = Integer.valueOf(columnString);

for (int index = 0; index < model.getRowCount(); index++) {
int indexSorted = tbl.convertRowIndexToModel(index);
String curValue = (String)model.getValueAt(indexSorted, 1);
//get if current number is higher than unchecked value
if (curValue != null && !curValue.equals("") && Integer.valueOf(curValue) > tmpPos) {
int curValueToChange = Integer.valueOf(curValue) - 1;
model.setValueAt(String.valueOf(curValueToChange),indexSorted, 1);
}
}
model.setValueAt("",row, 1);
}
}
}
});
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.weighty = 1;
JScrollPane scrollPane = new JScrollPane(tbl);
getContentPane().add(scrollPane, gbc);
}
}

PS:代码是为这个例子写的,所以请不要怀疑它不遵循通用的编码标准。对不起,如果我的代码让你的眼睛流血。 ;)

感谢您的帮助!

编辑:我试图构建我的问题以便更好地概述问题并使代码更易于阅读(我认为),抱歉如果难以理解,如果有问题我会尝试回答它们。

EDIT2:添加了一个简单 JFrame 的代码,这样您就可以复制和粘贴代码来自己查看问题

最佳答案

我发现我的示例显示了错误的值,因为:

当我转换行时

tbl.convertRowIndexToModel(row);

我得到了错误的行索引。

在我删除了转换行索引的 2 行之后,我得到了正确的值。

关于Java Swing JTable - 排序后获得正确的行索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40665592/

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