我有一个使用AbstractTableModel的JTable。 基本上我的程序读取文件夹并将文件夹中的文件添加到表中。 我已经设置了我的数据数组:
public void buildPluginSheet(){
String[] files= Files.getAvailableFiles();
data.clear();
for(int i=0; i<files.length; i++)
{
Object[] tmp = {files[i], version, new Boolean(isAvailable(files[i]))};
data.add(tmp);
}
}
数据类型为ArrayList&lt;对象[] []&gt;
如果表中有布尔值,它就像一个复选框一样吗?我需要的是能够在选中复选框时执行一个功能,而在未选中时执行另一个功能。此外,我必须能够传递复选框所在的行,以便我可以获得与复选框关联的文件名。
我的AbstractTableModel如下所示:
class MyTableModel extends AbstractTableModel{
private static final long serialVersionUID = 4567658160237952337L;
@Override
public boolean isCellEditable(int row, int col){
if(col == 2){
return true;
}
return false;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
return data.size();
}
public void setValueAt(Object value, int row, int col) {
data.get(row)[col] = value;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public Class getColumnClass(int column) {
return (getValueAt(0, column).getClass());
}
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public Object getValueAt(int row, int col) {
return data.get(row)[col];
}
}
这是我创建JTable的代码:
filesTable = new JTable(model);
filesTable.setRowSorter(sorter);
filesTable.setPreferredScrollableViewportSize(new Dimension(550, 260));
filesTable.setFillsViewportHeight(true);
filesTable.getTableHeader().setReorderingAllowed(false);
pluginsTable.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
if(true){
System.out.println("Hello");
}
}
});
我在这里和其他地方看了很多不同的解决方案,没有运气.. 我尝试过tableChanged和类似函数的不同实现。 我该如何解决这个问题?
先谢谢你们!
答案 0 :(得分:0)
您需要将Table Changed侦听器添加到表中。请查看此链接,然后转到“收听数据更改”部分: http://docs.oracle.com/javase/tutorial/uiswing/components/table.html
答案 1 :(得分:0)
为此,您可以使用TableModelListener
来监听复选框列并触发所需的事件。以下是第一列中JCheckBox
的简单示例和侦听器:
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
public class Example extends JFrame {
public Example() {
List<Object[]> l = new ArrayList<Object[]>();
l.add(new Object[]{true,1,2});
l.add(new Object[]{true,3,4});
MyTableModel model = new MyTableModel(new String[]{"1","2","3"},l);
final JTable t = new JTable(model);
t.getTableHeader().setReorderingAllowed(false);
t.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
if(e.getColumn() == 0 && e.getFirstRow()>-1){
System.out.println("Row : " + e.getFirstRow() +
" value :" + t.getValueAt(e.getFirstRow(), e.getColumn()));
}
}
});
add(new JScrollPane(t));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String args[]) {
new Example();
}
class MyTableModel extends AbstractTableModel{
private String[] columnNames;
private List<Object[]> data;
public MyTableModel(String[] columnNames, List<Object[]> data ){
this.columnNames = columnNames;
this.data = data;
}
@Override
public boolean isCellEditable(int row, int col){
if(col == 0){
return true;
}
return false;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
return data.size();
}
public void setValueAt(Object value, int row, int col) {
data.get(row)[col] = value;
fireTableCellUpdated(row, col);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public Class getColumnClass(int column) {
if(column == 0){
return Boolean.class;
}
return (getValueAt(0, column).getClass());
}
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public Object getValueAt(int row, int col) {
return data.get(row)[col];
}
}
}
编辑:
您需要使用fireTableCellUpdated(row, col);
方法在TableModel
中致电setValueAt()
。我编辑了我的代码,模型中的细微变化检查了它。另外,我建议您阅读JTable
模型的oracle tutorial。