Swing 如何在JTable中的特定行中禁用JButton

Swing 如何在JTable中的特定行中禁用JButton,swing,jtable,jbutton,Swing,Jtable,Jbutton,我正在努力解决一个乍一看很简单的问题,可能是这样…-我必须在同一行中的一个单元格中禁用JTable on值中的某些按钮。 下面是我用于按钮渲染和编辑的内部类: private class CellButton { class ButtonsPanel extends JPanel { public JButton jbutton = new JButton("Accept!!"); public ButtonsPanel() { super()

我正在努力解决一个乍一看很简单的问题,可能是这样…-我必须在同一行中的一个单元格中禁用JTable on值中的某些按钮。 下面是我用于按钮渲染和编辑的内部类:

  private class CellButton {
    class ButtonsPanel extends JPanel {
      public JButton jbutton = new JButton("Accept!!");
      public ButtonsPanel() {
        super();
        setOpaque(true);
        jbutton.setFocusable(false);
        jbutton.setRolloverEnabled(false);
        jbutton.setSize(122, 30);
        jbutton.setFont(new java.awt.Font("Tahoma", 3, 12)); 
        jbutton.setForeground(new java.awt.Color(0, 102, 102));
        add(jbutton);
    }

    private class ButtonsRenderer extends ButtonsPanel implements TableCellRenderer {

      ButtonsPanel bp;

      public ButtonsRenderer() {
        super();
      }

      @Override
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        this.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
        Object o = table.getModel().getValueAt(row, 8);
        bp = (ButtonsPanel) o;
        if (jTable5.getValueAt(row, 3).equals("NORMALNA")) {
          bp.jbutton.setEnabled(false);
        }

        return this;
      }
    }

    private class ButtonsEditor extends ButtonsPanel implements TableCellEditor {

      ButtonsPanel bp;

      public ButtonsEditor(final JTable table, final String tableName) {
        super();

        //DEBUG: view button click -> control key down + edit button(same cell) press -> remain selection color
        MouseListener ml = new MouseAdapter() {
          @Override
          public void mousePressed(MouseEvent e) {
            ButtonModel m = ((JButton) e.getSource()).getModel();
            if (m.isPressed() && table.isRowSelected(table.getEditingRow()) && e.isControlDown()) {
              setBackground(table.getBackground());
            }
          }
        };
        jbutton.addActionListener(new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            int row = table.convertRowIndexToModel(table.getEditingRow());
            Object o = table.getModel().getValueAt(row, 0);
            fireEditingStopped();
            //update info status
            setDmlUpdateStatusPrejeteInfo();
            jDialog2.requestFocus();

          }
        });

        addMouseListener(new MouseAdapter() {
          @Override
          public void mousePressed(MouseEvent e) {
            fireEditingStopped();
          }
        });
      }

      @Override
      public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        this.setBackground(table.getSelectionBackground());
        Object o = table.getModel().getValueAt(row, 8);
        bp = (ButtonsPanel) o;
        if (jTable5.getValueAt(row, 3).equals("NORMALNA")) {
          bp.jbutton.setEnabled(false);
        }
        return this;
      }

      @Override
      public Object getCellEditorValue() {
        return "";
      }
      transient protected ChangeEvent changeEvent = null;

      @Override
      public boolean isCellEditable(EventObject e) {
        return true;
      }

      @Override
      public boolean shouldSelectCell(EventObject anEvent) {
        return true;
      }

      @Override
      public boolean stopCellEditing() {
        fireEditingStopped();
        return true;
      }

      @Override
      public void cancelCellEditing() {
        fireEditingCanceled();
      }

      @Override
      public void addCellEditorListener(CellEditorListener l) {
        listenerList.add(CellEditorListener.class, l);
      }

      @Override
      public void removeCellEditorListener(CellEditorListener l) {
        listenerList.remove(CellEditorListener.class, l);
      }

      public CellEditorListener[] getCellEditorListeners() {
        return listenerList.getListeners(CellEditorListener.class);
      }

      protected void fireEditingStopped() {
        // Guaranteed to return a non-null array
        Object[] listeners = listenerList.getListenerList();
        // Process the listeners last to first, notifying
        // those that are interested in this event
        for (int i = listeners.length - 2; i >= 0; i -= 2) {
          if (listeners[i] == CellEditorListener.class) {
            // Lazily create the event:
            if (changeEvent == null) {
              changeEvent = new ChangeEvent(this);
            }
            ((CellEditorListener) listeners[i + 1]).editingStopped(changeEvent);
          }
        }
      }

      protected void fireEditingCanceled() {
        // Guaranteed to return a non-null array
        Object[] listeners = listenerList.getListenerList();
        // Process the listeners last to first, notifying
        // those that are interested in this event
        for (int i = listeners.length - 2; i >= 0; i -= 2) {
          if (listeners[i] == CellEditorListener.class) {
            // Lazily create the event:
            if (changeEvent == null) {
              changeEvent = new ChangeEvent(this);
            }
            ((CellEditorListener) listeners[i + 1]).editingCanceled(changeEvent);
          }
        }
      }
    }

    public ButtonsRenderer br() {
      return new ButtonsRenderer();
    }

    public ButtonsEditor be(JTable jTable, String tableName) {
      return new ButtonsEditor(jTable, tableName);
    }
  }

a最好不要用Jbutton这个名字来称呼Jbutton,这会让人困惑

b有很多方法可以禁用jbutton,使其消失、删除、调整大小。。。但最好的可能是:

     Jbutton.setEnabled(false);
c我认为你可以使用这个非常有用的指南: