2013-12-16 63 views
0

我在第一眼看到一個簡單的問題(可能是這樣......) - 我必須禁用JTable中的某個按鈕同一行內的單元格。 下面是我對按鈕的渲染和編輯的內部類:如何在JTable的特定行中禁用JButton

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

回答

0

一),最好不要調用一個JButton爲名的JButton,它只是混亂

B)有許多方法來禁用一個JButton (使其消失,刪除它,調整它的大小...),但最好的大概是這樣的:

 Jbutton.setEnabled(false); 

三)我想你可以使用這個非常有用的指導:http://www.macs.hw.ac.uk/guidebook/?name=JButton&page=1