Java 为复选框添加操作侦听器AbstractTableModel
我有一个使用AbstractTableModel的JTable。 基本上,我的程序读取一个文件夹并将文件夹中的文件添加到表中。 我将数据数组设置为:Java 为复选框添加操作侦听器AbstractTableModel,java,swing,checkbox,jtable,actionlistener,Java,Swing,Checkbox,Jtable,Actionlistener,我有一个使用AbstractTableModel的JTable。 基本上,我的程序读取一个文件夹并将文件夹中的文件添加到表中。 我将数据数组设置为: public void buildPluginSheet(){ String[] files= Files.getAvailableFiles(); data.clear(); for(int i=0; i<files.length; i++) { Object[] tmp = {files[i
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);
}
}
这是创建我的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和类似函数的不同实现。。
我该如何解决这个问题
提前谢谢各位 您需要将表更改侦听器添加到表中。查看此链接并转到“侦听数据更改”部分:
为此,您可以使用需要侦听的复选框列并触发所需事件。下面是一个简单的示例,第一列中有
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];
}
}
}
import java.util.ArrayList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.event.TableModelEvent;
导入javax.swing.event.TableModelListener;
导入javax.swing.table.AbstractTableModel;
公共类示例扩展了JFrame{
公共示例(){
列表l=新的ArrayList();
l、 添加(新对象[]{true,1,2});
l、 添加(新对象[]{true,3,4});
MyTableModel模型=新的MyTableModel(新字符串[]{“1”、“2”、“3”},l);
最终JTable t=新JTable(模型);
t、 getTableHeader().setReorderingAllowed(false);
t、 getModel().addTableModelListener(新的TableModelListener()){
@凌驾
公共作废表已更改(TableModelEvent e){
如果(e.getColumn()==0&&e.getFirstRow()>-1){
System.out.println(“行:”+e.getFirstRow()+
“值:”+t.getValueAt(e.getFirstRow(),e.getColumn());
}
}
});
添加(新的JScrollPane(t));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
包装();
setVisible(真);
}
公共静态void main(字符串参数[]){
新例子();
}
类MyTableModel扩展了AbstractTableModel{
私有字符串[]列名称;
私人名单数据;
公共MyTableModel(字符串[]列名称,列表数据){
this.columnNames=columnNames;
这个数据=数据;
}
@凌驾
公共布尔值可编辑(int行,int列){
如果(列==0){
返回true;
}
返回false;
}
@凌驾
public int getColumnCount(){
返回columnNames.length;
}
@凌驾
public int getRowCount(){
返回data.size();
}
public void setValueAt(对象值、整行、整列){
data.get(row)[col]=值;
FireTableCell更新(行、列);
}
@SuppressWarnings({“unchecked”,“rawtypes”})
公共类getColumnClass(int列){
如果(列==0){
返回Boolean.class;
}
返回(getValueAt(0,列).getClass());
}
公共字符串getColumnName(int-col){
返回列名[col];
}
@凌驾
公共对象getValueAt(整数行,整数列){
返回数据。获取(行)[col];
}
}
}
编辑:
您需要调用
fireTableCellUpdated(行、列)在setValueAt()
方法中的表格模型中的code>。我编辑了我的代码,对你的模型做了一些小的修改。另外,我建议您阅读JTable
model。我已经尝试过添加一个简单的打印函数,以便知道是否正在调用它。还将侦听器添加到我的表中。。我将更新上面的代码。看看这里,您的模型实现无效:它必须在更改时触发相应的事件。另外,不要让模型成为一个监听器(到底是为了什么?),我试过了,我已经更新了上面的代码以匹配你的。。还是不行…谢谢!我现在开始工作了。我缺少setValueAt()中的fireTableCellUpdated()调用。非常感谢你的帮助。
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];
}
}
}