我在Java中遇到了一个问题。
显示问题的图片
问题是:
我有一个JTable,其中有两列(在图片中为测试目的有4列):一列是复选框,另一列是字符串。
每当用户勾选复选框时,位置列就会计数,因此第一个勾选的复选框将获得位置“1”,第二个勾选的复选框将获得位置“2”,依此类推。
当用户勾选一个具有10个项目的位置为5的复选框时,位置6及以上的行将会减少一个,并且位置5的单元格将设置为空字符串("")。
这个方法可以运行,但我遇到的问题是:
在我的示例图片中,您还可以看到2列: 列Row,在未排序表开始时给出 列RowIndexToModel,显示行的位置但转换为向量内的行,好吧我是这样想的,但似乎并不是。
这是示例类:
注意:此代码是为了本示例而编写的,因此请不要惊讶它没有遵循通用编码标准。如果我的代码让你的眼睛疼痛,请原谅。
感谢任何帮助!
编辑:我尝试为问题提供更好的概述结构,并使代码更易读(我认为)。如果难以理解,我将尝试回答问题。
编辑2:添加了一个简单的JFrame代码,这样您可以复制并粘贴代码以查看问题。
当用户勾选一个具有10个项目的位置为5的复选框时,位置6及以上的行将会减少一个,并且位置5的单元格将设置为空字符串("")。
这个方法可以运行,但我遇到的问题是:
- 用户勾选多个复选框,
- 然后对表进行排序
- 然后尝试勾选任何复选框
在我的示例图片中,您还可以看到2列: 列Row,在未排序表开始时给出 列RowIndexToModel,显示行的位置但转换为向量内的行,好吧我是这样想的,但似乎并不是。
这是示例类:
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);
}
}
注意:此代码是为了本示例而编写的,因此请不要惊讶它没有遵循通用编码标准。如果我的代码让你的眼睛疼痛,请原谅。
感谢任何帮助!
编辑:我尝试为问题提供更好的概述结构,并使代码更易读(我认为)。如果难以理解,我将尝试回答问题。
编辑2:添加了一个简单的JFrame代码,这样您可以复制并粘贴代码以查看问题。