【问题标题】:adding button to the cell in Jtable in netbeans在netbeans的Jtable中向单元格添加按钮
【发布时间】:2010-11-29 17:53:12
【问题描述】:

如何在netbeans的Jtable的单元格中添加按钮???

【问题讨论】:

    标签: java swing netbeans6.7


    【解决方案1】:

    Table Button Column 显示一种方式。

    【讨论】:

      【解决方案2】:

      您需要添加自定义单元格渲染器,重新定位表格中的一些事件并在按钮状态更改时重新绘制单元格。这很邪恶,很讨厌,但可以做到。

      【讨论】:

        【解决方案3】:

        如Button Table Example 所示,我们将创建一个扩展JButton 并实现TableCellRenderer 的类。

        class ButtonRenderer extends JButton implements TableCellRenderer {
        
          public ButtonRenderer() {
            setOpaque(true);
          }
        
          public Component getTableCellRendererComponent(JTable table, Object value,
              boolean isSelected, boolean hasFocus, int row, int column) {
            if (isSelected) {
              setForeground(table.getSelectionForeground());
              setBackground(table.getSelectionBackground());
            } else {
              setForeground(table.getForeground());
              setBackground(UIManager.getColor("Button.background"));
            }
            setText((value == null) ? "" : value.toString());
            return this;
          }
        }
        

        然后您还需要为该列创建一个单元格编辑器。

        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();
              }
            });
          }
        
          public Component getTableCellEditorComponent(JTable table, Object value,
              boolean isSelected, int row, int column) {
            if (isSelected) {
              button.setForeground(table.getSelectionForeground());
              button.setBackground(table.getSelectionBackground());
            } else {
              button.setForeground(table.getForeground());
              button.setBackground(table.getBackground());
            }
            label = (value == null) ? "" : value.toString();
            button.setText(label);
            isPushed = true;
            return button;
          }
        
          public Object getCellEditorValue() {
            if (isPushed) {
              // 
              // 
              JOptionPane.showMessageDialog(button, label + ": Ouch!");
              // System.out.println(label + ": Ouch!");
            }
            isPushed = false;
            return new String(label);
          }
        
          public boolean stopCellEditing() {
            isPushed = false;
            return super.stopCellEditing();
          }
        
          protected void fireEditingStopped() {
            super.fireEditingStopped();
          }
        }
        

        然后,我们将设置ButtonRender 的实例作为该列的单元格渲染,并将 ButtonEditor 的实例设置为单元格编辑器。

        \\"Button" is the column name
        table.getColumn("Button").setCellRenderer(new ButtonRenderer());
        table.getColumn("Button").setCellEditor(
            new ButtonEditor(new JCheckBox()));
        

        提供的链接中的example 有完整的可运行示例。

        【讨论】:

        • 我试过这段代码,它完美地显示了按钮,但我无法点击它,它没有启用或禁用,所以你知道它有什么问题吗?它看起来像您发布的链接内的图片,但我无法点击它...提前致谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        • 1970-01-01
        • 2019-09-03
        • 2021-05-10
        • 2013-05-10
        • 2015-02-21
        • 1970-01-01
        相关资源
        最近更新 更多