2016-11-20 2 views
1

На моем JTable я устанавливаю цвета фона строк, используя функцию prepareRenderer. Я также удалил границу фокуса, а затем в коде я отключил выбор строки.Цвет фона мерцает с использованием JCheckBox в JTable

JTable table = new JTable() { 
    private static final long serialVersionUID = -2965586838134675413L; 
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
     Component c = super.prepareRenderer(renderer, row, column); 
     c.setBackground(row % 2 == 1 ? Color.WHITE : new Color(255, 245, 248)); 
     ((JComponent) c).setBorder(null); 
     return c; 
    } 
}; 

DefaultTableModel tableModel = new DefaultTableModel(sampleData, headers) { 
    private static final long serialVersionUID = 9186050244728809804L; 

    @Override 
    public Class<?> getColumnClass(int columnIndex) { 
     switch(columnIndex) { 
      case 0: 
       return Boolean.class; 
      default: 
       return String.class; 
     } 
    } 


    @Override 
    public boolean isCellEditable(int row, int column) { 
     switch(column) { 
      case 0: 
       return true; 
      default: 
       return false; 
     } 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public void setValueAt(Object aValue, int row, int column) { 
     if (aValue instanceof Boolean && column == 0) { 
      //System.out.println(aValue); 
      Vector<Boolean> rowData = (Vector<Boolean>) getDataVector().get(row); 
      rowData.set(0, (boolean) aValue); 
      fireTableCellUpdated(row, column); 
     } 
    } 
}; 

table.setModel(tableModel); 
table.setRowSelectionAllowed(false); 

Проблема заключается в том, когда я нажимаю на JCheckBox эсов в цвете фона коммутаторах белого цвета, а кнопка мыши нажата. Есть ли способ сохранить цвет от изменения, нажав на JCheckBox?

Примечание
Использование булева по умолчанию средства визуализации для достижения этой цели все еще имеет ту же проблему, но это не так часто

private class BooleanRenderer extends JCheckBox implements TableCellRenderer 
{ 
    private static final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); 

    public BooleanRenderer() { 
     super(); 
     setHorizontalAlignment(JLabel.CENTER); 
     setBorderPainted(true); 
    } 

    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 { 
      setForeground(table.getForeground()); 
      setBackground(table.getBackground()); 
     } 
     setSelected((value != null && ((Boolean)value).booleanValue())); 
     setBorder(noFocusBorder); 

     return this; 
    } 
} 

table.setDefaultRenderer(Boolean.class, new BooleanRenderer()) 

Примечание 2
Я также попытался добавить MouseListener к JCheckBox, но это не помогло, так как слушатель мыши не подключался к JCheckBox

JTable fileList = new JTable() { 
    private static final long serialVersionUID = -2965586838134675413L; 
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
     Component c = super.prepareRenderer(renderer, row, column); 
     c.setBackground(row % 2 == 1 ? Color.WHITE : new Color(255, 245, 248)); 
     ((JComponent) c).setBorder(null); 

     if(c instanceof JCheckBox) { 
      c.addMouseListener(new MouseAdapter() { 
       public void mouseClicked(MouseEvent e) { 
        setBackground(row % 2 == 1 ? Color.WHITE : new Color(255, 245, 248)); 
       } 

       public void mousePressed(MouseEvent e) { 
        setBackground(row % 2 == 1 ? Color.WHITE : new Color(255, 245, 248)); 
       } 

       public void mouseReleased(MouseEvent e) { 
        setBackground(row % 2 == 1 ? Color.WHITE : new Color(255, 245, 248)); 
       } 
      }); 
     } 
     return c; 
    } 
}; 

Edit - SSSCE используя первый пример кода

import java.awt.Color; 
import java.awt.Component; 
import java.awt.GridLayout; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 

public class JTableTest extends JFrame { 
    private JTableTest() { 
     super("Button Layout"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new GridLayout(1, 1)); 
     createPanel(); 
     pack(); 
     setVisible(true); 
    } 

    JPanel panel = new JPanel(new GridLayout(1, 1)); 
    JScrollPane scroll = new JScrollPane(); 

    private void createPanel() { 
     Object[] headers = {"Select", "Title", "Artist", "Length"}; 
     Object[][] sampleData = {{true, "Bat Outta Hell", "Meat Loaf", "673"}, 
       {false, "Spanish Train", "Chris De Burgh", "358"}}; 
     JTable table = new JTable() { 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
       Component c = super.prepareRenderer(renderer, row, column); 
       c.setBackground(row % 2 == 1 ? Color.WHITE : Color.RED); 
       ((JComponent) c).setBorder(null); //Left in so it is easier to see problem 
       return c; 
      } 
     }; 

     DefaultTableModel tableModel = new DefaultTableModel(sampleData, headers) { 
      @Override 
      public Class<?> getColumnClass(int columnIndex) { 
       switch(columnIndex) { 
        case 0: 
         return Boolean.class; 
        default: 
         return String.class; 
       } 
      } 
     }; 

     table.setModel(tableModel); 
     table.setRowSelectionAllowed(false); //Left in so it is easier to see problem 

     scroll.getViewport().add(table); 
     panel.add(scroll); 
     getContentPane().add(panel); 
    } 

    public static void main(String[] args) { 
     new JTableTest(); 
    } 
} 
+1

Чтобы лучше помочь, отправьте сообщение [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

@AndrewThompson Включено. Извини за это. Я думал, что кода JTable достаточно. Есть ли у вас какие-либо идеи о том, что может быть причиной этого? – Dan

+0

@ Dan Возможно, теперь вы должны обрезать другие части, когда вы включили SSCCE. –

ответ

1

Вы пропускаете prepareEditor переопределение в вашем JTable Например, я добавил один в вашем образце. Когда вы нажимаете на этот флажок, то отображается только компонент редактора, а не компонент рендеринга. Вам нужно подготовить этот компонент, чтобы получить нужный цвет.

import java.awt.Color; 
import java.awt.Component; 
import java.awt.GridLayout; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableCellRenderer; 

@SuppressWarnings("serial") 
public class JTableTest extends JFrame { 
    private JTableTest() { 
     super("Button Layout"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new GridLayout(1, 1)); 
     createPanel(); 
     pack(); 
     setVisible(true); 
    } 

    JPanel panel = new JPanel(new GridLayout(1, 1)); 
    JScrollPane scroll = new JScrollPane(); 

    private void createPanel() { 
     Object[] headers = {"Select", "Title", "Artist", "Length"}; 
     Object[][] sampleData = {{true, "Bat Outta Hell", "Meat Loaf", "673"}, 
       {false, "Spanish Train", "Chris De Burgh", "358"}}; 
     JTable table = new JTable() { 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
       Component c = super.prepareRenderer(renderer, row, column); 
       c.setBackground(row % 2 == 1 ? Color.WHITE : Color.RED); 
       ((JComponent) c).setBorder(null); //Left in so it is easier to see problem 
       return c; 
      } 

      @Override 
      public Component prepareEditor(TableCellEditor editor, int row, int column) { 
       Component c = super.prepareEditor(editor, row, column); 
       c.setBackground(row % 2 == 1 ? Color.WHITE : Color.RED); 
       ((JComponent) c).setBorder(null); //Left in so it is easier to see problem 
       return c; 
      } 
     }; 

     DefaultTableModel tableModel = new DefaultTableModel(sampleData, headers) { 
      @Override 
      public Class<?> getColumnClass(int columnIndex) { 
       switch(columnIndex) { 
        case 0: 
         return Boolean.class; 
        default: 
         return String.class; 
       } 
      } 
     }; 

     table.setModel(tableModel); 
     table.setRowSelectionAllowed(false); //Left in so it is easier to see problem 

     scroll.getViewport().add(table); 
     panel.add(scroll); 
     getContentPane().add(panel); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater (
      new Runnable() { 
       @Override 
       public void run() { 
        new JTableTest(); 
       } 
      } 
     ); 
    } 
} 
+0

Большое спасибо – Dan

+0

@Dan You 're welcome! –

+0

Из интереса у вас есть понимание на [это] (http://stackoverflow.com/questions/40698612/setting-jtableheader-holder-background-colour) – Dan

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