Z寒火 2024-01-08 17:06 采纳率: 56%
浏览 4
已结题

swing中table添加按钮没反应

img

            for (FaultData fd : fdatas) {
                Object[] arr = new Object[columnCount];
                arr[0] = (++count) + "";
                arr[1] = fd.getLine();
                arr[2] = fd.getDeviceName();

                arr[3] = fd.getFaultTime() + " " + UIUtil.getNumStr2(fd.getUs(), fd.getTimeType()) + fd.getTimeType().replace("us", "µs");
                if (fd.getTimeType().equals(""))
                    arr[3] = arr[3] + "µs";
                arr[4] = fd.getLocStr();
                arr[5] = fd.getAmplitudeInfo();
                arr[6] = fd.getFaPhase();
                arr[7] = fd.getNatureInfo();
                arr[9] = fd.getRemark();
                arr[10] = fd.getId();
                arr[11] = "操作1";
                arr[12] = "操作2";
                arr[13] = "操作3";
                arr[14] = "操作4";

                content.add(arr);
            }
        table.getColumnModel().getColumn(11).setPreferredWidth(120);
        table.getColumnModel().getColumn(11).setCellRenderer(new ButtonRenderer());
        table.getColumnModel().getColumn(11).setCellEditor(new ButtonEditor(new JCheckBox("1")));
        table.getColumnModel().getColumn(12).setPreferredWidth(120);
        table.getColumnModel().getColumn(12).setCellRenderer(new ButtonRenderer());
        table.getColumnModel().getColumn(12).setCellEditor(new ButtonEditor(new JCheckBox("2")));
        table.getColumnModel().getColumn(13).setPreferredWidth(120);
        table.getColumnModel().getColumn(13).setCellRenderer(new ButtonRenderer());
        table.getColumnModel().getColumn(13).setCellEditor(new ButtonEditor(new JCheckBox("3")));
        table.getColumnModel().getColumn(14).setPreferredWidth(120);
        table.getColumnModel().getColumn(14).setCellRenderer(new ButtonRenderer());
        table.getColumnModel().getColumn(14).setCellEditor(new ButtonEditor(new JCheckBox("4")));
// 按钮渲染器
    static class ButtonRenderer extends JButton implements TableCellRenderer {
        public ButtonRenderer() {
            setOpaque(true);
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            setText((value == null) ? "" : value.toString());
            return this;
        }
    }

    // 按钮编辑器
    static class ButtonEditor extends DefaultCellEditor {
        private JButton button;

        public ButtonEditor(JCheckBox checkBox) {
            super(checkBox);
            button = new JButton();
            button.setOpaque(true);
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    fireEditingStopped();
                    switch (checkBox.getText()) {
                        case "1":
                            // 默认操作,可以在这里处理"操作1"的情况
                            System.out.println("操作1 clicked in row " + table.getEditingRow());
                            break;
                        case "2":
                            // 执行操作2的操作
                            System.out.println("操作2 clicked in row " + table.getEditingRow());
                            break;
                        case "3":
                            // 执行操作3的操作
                            System.out.println("操作3 clicked in row " + table.getEditingRow());
                            break;
                        case "4":
                            // 执行操作4的操作
                            System.out.println("操作4 clicked in row " + table.getEditingRow());
                            break;
                    }

                }
            });
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            button.setText((value == null) ? "" : value.toString());
            return button;
        }

        @Override
        public Object getCellEditorValue() {
            return button.getText();
        }
    }

我想在这个table中每一行添加4个操作按钮,但我按这种方式添加后没有用,点击按钮没有进入actionPerformed中。这是怎么回事?是和其他的listenter冲突了吗?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-08 19:13
    关注

    【以下回答由 GPT 生成】

    问题解决步骤如下:

    1. 首先,确保你已经导入了正确的Swing库。可以使用以下代码检查是否导入了必要的类:
    import javax.swing.JButton;
    import javax.swing.JTable;
    import javax.swing.table.TableCellRenderer;
    import javax.swing.table.TableColumn;
    
    1. 检查ButtonRendererButtonEditor类的实现。确保这两个类正确处理按钮的渲染和编辑。如果你没有提供类的实现,可以参考下面的代码:

    ButtonRenderer类实现:

    import java.awt.Component;
    import javax.swing.JButton;
    import javax.swing.JTable;
    import javax.swing.table.TableCellRenderer;
    
    public class ButtonRenderer implements TableCellRenderer {
    
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (value instanceof Component) {
                return (Component) value;
            } else {
                JButton button = new JButton(value.toString());
                return button;
            }
        }
    }
    

    ButtonEditor类实现:

    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.DefaultCellEditor;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JOptionPane;
    import javax.swing.JTable;
    
    public class ButtonEditor extends DefaultCellEditor {
    
        protected JButton button;
        private String label;
        private boolean isPushed;
    
        public ButtonEditor(JCheckBox checkBox) {
            super(checkBox);
            button = new JButton();
            button.setOpaque(true);
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    fireEditingStopped();
                    // 在这里添加你的按钮点击处理逻辑
                    JOptionPane.showMessageDialog(null, "按钮被点击");
                }
            });
        }
    
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            if (value instanceof Component) {
                Component comp = (Component) value;
                return comp;
            } else {
                label = (value == null) ? "" : value.toString();
                button.setText(label);
                isPushed = true;
                return button;
            }
        }
    }
    
    1. 检查是否将ButtonRendererButtonEditor正确应用于相关的列。确保你在正确的列上设置了渲染器和编辑器。

    根据你提供的代码,你将ButtonRendererButtonEditor应用于列11和12。确保这两列不是隐藏的,并且宽度足够以容纳按钮。

    如果以上步骤都没有问题,但按钮仍然没有任何反应,则需要继续调查其他可能的问题。你可以检查按钮事件是否被正确触发,或者检查是否有其他代码干扰了按钮的行为。

    希望这些步骤可以帮助你解决问题。如果还有其他问题或需要更多帮助,请告诉我。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月9日
  • 创建了问题 1月8日

悬赏问题

  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 路易威登官网 里边的参数逆向
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程
  • ¥20 模型在y分布之外的数据上预测能力不好如何解决
  • ¥15 processing提取音乐节奏
  • ¥15 gg加速器加速游戏时,提示不是x86架构
  • ¥15 python按要求编写程序
  • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入