2013-05-07 70 views
0

我有一個JCheckBox在JTable的最後一列工作。但是,當我將顏色設置爲該列中的單元格時,它似乎會覆蓋呈現的對象(JCheckBox)。設置JTable中JCheckBox單元格的顏色

下面的代碼段是什麼,我試圖做的:

//Overriding these methods using the DefaultTableModel constructor works . 
DefaultTableModel model = new DefaultTableModel(data, columnNames) 
     { 
     @Override 
     public Class getColumnClass(int col) 
      { 
      return getValueAt(1, col).getClass(); 
     } 

     @Override 
     public boolean isCellEditable(int rowIndex, int colIndex) 
      { 
      return (colIndex == CHECK_COL); 
     } 
     }; 

JTable table = new JTable(model); 

//Constructing and setting a render background and foreground color 
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); 
renderer.setBackground(Color.BLACK); 
renderer.setForeground(new Color(255, 0, 255)); 

TableColumn column = table.getColumnModel().getColumn(4); 
column.setCellRenderer(centerRenderer); 

//Now the last column contains just Boolean values, rather than JCheckBox's when I try set the colors. 

任何人都可以找出我如何克服這個問題? 謝謝。十分讚賞

+1

'DefaultTableCellRenderer'是基於'JLabel' – MadProgrammer 2013-05-07 01:05:52

回答

7
  1. DefaultTableCellRenderer是基於JLabel,所以它永遠不會渲染器JCheckBox
  2. 的​​/background值可能被重寫作爲渲染過程的一部分,這意味着它們將針對每個小區改變,失去了你提供的默認值。

您需要提供一個...

  1. 是基於JCheckBox
  2. 可以恢復默認,當你希望他們想要​​/background值單元格渲染...

這是一個基本的例子,它演示的基本概念...

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.Border; 
import javax.swing.border.EmptyBorder; 
import javax.swing.plaf.UIResource; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableModel; 

public class BooleanCellEditor { 

    public static void main(String[] args) { 
     new BooleanCellEditor(); 
    } 

    public BooleanCellEditor() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       TableModel model = new AbstractTableModel() { 
        @Override 
        public Class<?> getColumnClass(int columnIndex) { 
         return Boolean.class; 
        } 

        @Override 
        public int getRowCount() { 
         return 4; 
        } 

        @Override 
        public int getColumnCount() { 
         return 1; 
        } 

        @Override 
        public Object getValueAt(int rowIndex, int columnIndex) { 
         return true; 
        } 
       }; 

       JTable table = new JTable(model); 
       table.setDefaultRenderer(Boolean.class, new BooleanRenderer()); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new JScrollPane(table)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public static class BooleanRenderer extends JCheckBox implements TableCellRenderer, UIResource { 

     private static final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); 

     public BooleanRenderer() { 
      super(); 
      setHorizontalAlignment(JLabel.CENTER); 
      setBorderPainted(true); 
      setOpaque(true); 
      setText("Hello"); 
     } 

     public Component getTableCellRendererComponent(JTable table, Object value, 
       boolean isSelected, boolean hasFocus, int row, int column) { 
      if (isSelected) { 
       setForeground(table.getSelectionForeground()); 
       super.setBackground(table.getSelectionBackground()); 
      } else { 
       setBackground(Color.BLACK); 
       setForeground(new Color(255, 0, 255)); 
      } 
      setSelected((value != null && ((Boolean) value).booleanValue())); 

      if (hasFocus) { 
       setBorder(UIManager.getBorder("Table.focusCellHighlightBorder")); 
      } else { 
       setBorder(noFocusBorder); 
      } 

      return this; 
     } 
    } 
} 

注意,我從默認實現偷走了BooleanRendererJTable

+0

感謝您的答覆。我懂了。因爲我的類擴展了JFrame,是否需要更改代碼的佈局(如您的示例中所示,以擴展JCheckBox),還是可以繼續擴展JFrame並將該類(您的示例)作爲內部類?謝謝 – 2013-05-07 11:13:37

+0

另外我怎樣才能構建我的表與我的數據和columnNames,因爲你有它更改爲TableModel model = new AbstractTableModel()...?謝謝,對不起所有問題 – 2013-05-07 11:18:08

+0

好吧,我想通了。它現在有效。非常感謝。 – 2013-05-07 12:00:48

相關問題