2013-05-07 5 views
0

У меня есть JCheckBox, работающий в последнем столбце в JTable. Но когда я устанавливаю цвет для ячеек в этом столбце, он, кажется, перезаписывает рендер-объект (JCheckBox).Настройка цвета для ячейки JCheckBox в JTable

Фрагмент кода ниже, что я пытаюсь сделать:

//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

ответ

7
  1. DefaultTableCellRenderer основан на JLabel, поэтому он никогда не будет рендерер а JCheckBox
  2. В foreground/background значения могут быть переопределены как часть процесса визуализации, то есть они будут меняться для каждой ячейки, потеряв значения по умолчанию, которые вы предоставили.

Вы должны предоставить средства визуализации клеток, что ...

  1. основан на JCheckBox
  2. можно восстановить по умолчанию foreground/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; 
     } 
    } 
} 

Заметь, я украл BooleanRenderer от реализации по умолчанию в JTable;)

+0

Спасибо за ваш ответ. Понимаю. Поскольку мой класс расширяет JFrame, мне нужно изменить компоновку кода (как в вашем примере, расширить JCheckBox), или я могу расширить JFrame и иметь этот класс (ваш пример) как внутренний класс? Спасибо –

+0

Также как я смогу построить таблицу с моими данными и именами столбцов, так как вы изменили ее на TableModel model = new AbstractTableModel() ...? Спасибо, извините за все вопросы –

+0

OK Я понял. Он работает сейчас. Большое спасибо. –

Смежные вопросы