JTable - 添加复选框的动作监听器

4

我创建了一个简单的带有复选框的JTable,如下所示:

DefaultTableModel model = new DefaultTableModel();
jTable1.setModel(model);

model.addColumn("No:", no1);
model.addColumn("Remark", remark1);
model.addColumn("Color", colors1);
model.addColumn("Done");

TableColumn col1 = jTable1.getColumnModel().getColumn(0);
col1.setPreferredWidth(1);

TableColumn col4 = jTable1.getColumnModel().getColumn(3);
col4.setCellEditor(jTable1.getDefaultEditor(Boolean.class));
col4.setCellRenderer(jTable1.getDefaultRenderer(Boolean.class));
col4.setPreferredWidth(50);

jTable1.setShowGrid(true);
jTable1.setGridColor(Color.BLACK);
jTable1.setAutoCreateRowSorter(true); 

功能正常,但如何为复选框添加动作监听器。例如,当勾选复选框时,我需要弹出确认消息。


我可以获取它的样例或参考链接吗? - chinna_82
我想为复选框添加动作监听器。不,你不需要这样做 :-) 你还没有学会如何使用编辑器/表格吗? - kleopatra
@kleopatra,您是在说我不能添加动作监听器吗?那么最好的方法是什么呢? - chinna_82
2
阅读有关如何使用表格的基础教程(例如上面提到的Swing标签维基中的教程),正如上次在Swing问题方面淹没该网站时建议您的那样;-) 您必须自己学习基本概念,这里没有任何人可以做到这一点。而且,您并没有解释您要实现什么...除了-1之外,投票关闭。 - kleopatra
1
"你是说我不能添加动作监听器吗。" - 引自概念:编辑器和渲染器 :"在进行接下来的几项任务之前,您需要了解表格如何绘制其单元格。你可能期望表格中的每个单元格都是一个组件。但出于性能原因,Swing 表格实现有所不同。相反,通常使用单个单元格渲染器来绘制所有包含相同类型数据的单元格。" - Paul Samsotha
2个回答

12
当我的复选框被选中时,我需要弹出一个确认消息。您无需为渲染器/编辑器添加ActionListener,但需要监听表格模型数据更改。请参阅如何使用表格教程的监听数据更改部分。
  • 向您的TableModel添加一个新的TableModelListener
  • 验证更新的单元格值是否为Boolean,且其值为true
  • 询问用户确认更新。如果他/她不确认,则将单元格的值设置回false
  • 请参见TableModelEvent API

编辑

请注意,在这种情况下,由于您正在使用布尔值,因此有两个可能的值可以进行检查。但是,对于其他情况的输入验证,所述过程不起作用,因为当更改已经发生时,监听器将被通知,并且您将无法将值设置回去,因为它将不再存在。

请看@kleopatra在这个问题的答案:JTable输入验证器。正如她所说,更好的方法是提供一个自定义CellEditor并在stopCellEditing()方法实现中进行验证。只是作为建议,我会使用一个以JCheckBox为参数的DefaultCellEditor并覆盖上述方法。

0

你必须添加Item Listener来在复选框中添加Action Listener。这是一个餐厅结算系统的简单示例:

package swingDemo;

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;

public class RestaurantOrderingBilling extends JFrame {

    private static final long serialVersionUID = 1L;
    private JTable table;
    
    JButton b; 
    JLabel l;
    public RestaurantOrderingBilling() {
        Object[] columnNames = {"Select", "Item Names", "Price"};
        Object[][] data = {
                {false, "Burger", new Double(120.0)},   
                {true, "Chowmin", new Double(180.0)},
                {false, "Pizza", new Double(200.0)},
        };

        DefaultTableModel model = new DefaultTableModel(data, columnNames);

        table = new JTable(model) {
            private static final long serialVersionUID = 1L;

            @Override
            public Class getColumnClass(int column) {
                switch (column) {
                    case 0:
                        return Boolean.class;
                    case 1:
                        return String.class;
                    default:
                        return Double.class;    
                }
            }
        };
        
        // Add an ItemListener to the checkboxes in the table
        TableColumnModel columnModel = table.getColumnModel();
        TableColumn column = columnModel.getColumn(0);
        column.setCellEditor(table.getDefaultEditor(Boolean.class));
        column.setCellRenderer(table.getDefaultRenderer(Boolean.class));
        JCheckBox checkBox = new JCheckBox();
        checkBox.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                int row = table.getSelectedRow();
                int column = table.getSelectedColumn();
                Boolean selected = (Boolean) model.getValueAt(row, column);
                System.out.println("Checkbox in row " + row + " is " + (selected ? "not selected" : "selected") +" Price: "+data[row][2]);
            }
        });
        column.setCellEditor(new DefaultCellEditor(checkBox));
        
        l = new JLabel("");
        // define the order button
        b = new JButton("Order Items");
        
        b.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                     // Find the total price    
                    double totalPrice = 0.0;
                    int numRows = model.getRowCount();
                    for (int i = 0; i < numRows; i++) {
                        Boolean selected = (Boolean) model.getValueAt(i, 0);
                        if (selected) {
                            Double price = (Double) model.getValueAt(i, 2);
                            totalPrice += price;
                        }
                    }
                    System.out.println("Total Price: " + totalPrice);
                    l.setText("Total Price: "+totalPrice);
                }
                
    });
       
        
        table.setShowGrid(false);
        
        add(table);
        add(b);
        add(l);

        setLayout(new FlowLayout());
        setResizable(false);
        setVisible(true);
        setSize(400, 400);
    }

    public static void main(String args[]) {
        new RestaurantOrderingBilling();
    }
}



GUI输出如下:

GUI Output


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接