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

时间:2013-12-16 22:52:59

标签: swing jtable jbutton

我正在努力解决第一眼看到的简单问题(可能就是这样......) - 我必须在相同行中的一个单元格中禁用JTable中的某个按钮值。 下面是我用于按钮渲染和编辑的内部类:

  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);
    }
  }

1 个答案:

答案 0 :(得分:0)

a)最好不要在Jbutton名称中调用Jbutton,这只会令人困惑

b)有许多方法可以禁用jbutton(让它消失,删除它,调整大小......)但最好的方法可能就是这样:

     Jbutton.setEnabled(false);

c)我认为您可以使用这个非常有用的指南:http://www.macs.hw.ac.uk/guidebook/?name=JButton&page=1