问题描述
我有一个打算使用的jTable代码,但是它的问题是,当我单击复选框时,它没有选择/取消选择它,而是必须单击两次.但是,如果我在行中选择除包含复选框的单元格之外的其他任何单元格,那么目的就解决了.
I have a jTable code i intend to use, but the problem with it is that when i click on the checkbox once it doesn't select/deselect it, instead i have to click twice. But if i select any other cell in the row except the one containing the checkbox the purpose is solved.
这是我的代码:
public class TableSelectionTest extends JFrame implements ListSelectionListener {
private final int COLUMN_COUNT = 5;
private TblModel model;
public TableSelectionTest() {
initialize();
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
}
private void initialize() {
List data = new ArrayList();
for (int i = 0; i < 10; i++) {
Object record[] = new Object[COLUMN_COUNT];
record[0] = Boolean.FALSE;
for (int j = 1; j < COLUMN_COUNT; j++)
{
record[j] = new Integer(j);
}
data.add(record);
}
model = new TblModel(data);
JTable table = new JTable(model);
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.getSelectionModel().addListSelectionListener (this);
JScrollPane scroll = new JScrollPane(table);
getContentPane().add(scroll, BorderLayout.CENTER);
}
public static void main(String[] args) {
TableSelectionTest f = new TableSelectionTest();
f.show();
}
class TblModel extends AbstractTableModel {
private List data;
public TblModel(List data) {
this.data = data;
}
public int getColumnCount() {
return COLUMN_COUNT;
}
public int getRowCount() {
return data == null ? 0 : data.size();
}
public void setValueAt(Object value, int rowIndex, int columnIndex) {
getRecord(rowIndex)[columnIndex] = value;
super.fireTableCellUpdated(rowIndex, columnIndex);
}
public Object getValueAt(int rowIndex, int columnIndex) {
return getRecord(rowIndex)[columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
if(columnIndex == 0)
return true;
else
return false;
}
public Class getColumnClass(int columnIndex) {
if (data == null || data.size() == 0) {
return Object.class;
}
Object o = getValueAt(0, columnIndex);
return o == null ? Object.class : o.getClass();
}
private Object[] getRecord(int rowIndex) {
return (Object[]) data.get(rowIndex);
}
}
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
ListSelectionModel lsm = (ListSelectionModel) e.getSource();
int index = lsm.getMinSelectionIndex();
if(model.getRecord(index)[0] == Boolean.FALSE)
model.setValueAt(Boolean.TRUE, index, 0);
else if(model.getRecord(index)[0] == Boolean.TRUE)
model.setValueAt(Boolean.FALSE, index, 0);
}
}
}
请尽快回复,因为它困扰了我很多预先谢谢你:)
Please reply soon as it is bugging me a lotThank you in advance :)
推荐答案
根据@rob的正确答案,您的ListSelectionListener
每次更改都会重置该值;查看表格中的标签以查看效果.您的setValueAt()
方法已经更新了数据.添加此println()
即可查看:
Amplifying on @rob's correct answer, your ListSelectionListener
is resetting the value with each change; tab through the table to see the effect. Your setValueAt()
method already updates the data; add this println()
to see:
for (Object row : data) {
System.out.println(((Object[]) row)[0]);
}
顺便说一句,请考虑使您的data
更通用,并避免使用诸如show()
之类的不赞成使用的方法.
As an aside, consider making your data
more generic and avoid deprecated methods such as show()
.
附录:这是一个例子;另请参见 如何使用表 .
Addendum: Here's an example; see also How to Use Tables.
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
public class TableSelectionTest extends JFrame {
private final int COLUMN_COUNT = 5;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new TableSelectionTest();
}
});
}
public TableSelectionTest() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTable table = new JTable(new TblModel());
JScrollPane scroll = new JScrollPane(table);
this.add(scroll, BorderLayout.CENTER);
pack();
this.setVisible(true);
}
class TblModel extends AbstractTableModel {
private Random rnd = new Random();
private List<Boolean> data = new ArrayList<Boolean>();
public TblModel() {
for (int i = 0; i < 10; i++) {
data.add(rnd.nextBoolean());
}
}
@Override
public int getColumnCount() {
return COLUMN_COUNT;
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public void setValueAt(Object value, int rowIndex, int columnIndex) {
if (columnIndex == 0) {
data.set(rowIndex, (Boolean) value);
}
super.fireTableCellUpdated(rowIndex, columnIndex);
for (Boolean b : data) {
System.out.print(b + " ");
}
System.out.println();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (columnIndex == 0) {
return data.get(rowIndex);
} else {
return columnIndex;
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 0;
}
@Override
public Class getColumnClass(int columnIndex) {
if (columnIndex == 0) {
return Boolean.class;
} else {
return Integer.class;
}
}
}
}
这篇关于我必须选中两次复选框才能在jTable中选中/取消选中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!