2014-10-02 18 views
2

Я хочу создать JTable и покрасить его ячейки навсегда нажатием кнопки (очень похоже на excel в ячейках раскраски). Далеко, каждая ячейка, которую я выбираю, попадает в ArrayList<Cell> ,Ячейки цветной печати JTable постоянно, когда я нажимаю кнопку

Прежде всего, я хочу, чтобы каждая ячейка в списке была постоянно окрашена, когда я нажимаю кнопку (это отличие от кода, который я нашел). Shoud Мне нужно использовать statememnt, как это table.getColumnModel().getColumn(column).setCellRenderer(this);?

Это компилируемый код, и если вы его отлаживаете, вы увидите, что при нажатии кнопки я не могу получить доступ к методу getTableCellRendererComponent(). Почему это происходит? Буду признателен, если вы скажете мне свое мнение.

(Примечание: это воспроизведение огромной программы, поэтому в некоторых местах это немного большая грязная и жесткая кодировка. Невозможно уменьшить ее по мере того, что я хочу решить).

Класс ColorSelectedTableCells.java

public class ColorSelectedTableCells extends JPanel { 
    private JButton btn = new JButton("color cells"); 
    private MyCellRenderer myCellRenderer = new MyCellRenderer(); 
    public static final Object[][] DATA = new Object[3][3]; 
    public static final String[] COLS = {"A", "B", "C"}; 
    private static final int PREF_WIDTH = 400; 
    private static final int PREF_HEIGHT = 300; 
    private static CellSelectionSet cellSelectionSet = new CellSelectionSet(); 

    private JTable table = new JTable(DATA,COLS){ 
     @Override 
     public boolean isCellEditable(int row, int column) {return false;} 

     @Override 
     public boolean isCellSelected(int row, int column) { 
      if (cellSelectionSet.containsOneOrLess()) { 
      return super.isCellSelected(row, column); 
      } 
      return cellSelectionSet.contains(row, column); 
     } 

     @Override 
     public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend) { 
      super.changeSelection(rowIndex, columnIndex, toggle, extend); 
      if (toggle) { 
      cellSelectionSet.add(rowIndex, columnIndex); 
      } 
      else { 
      if (extend) { 
       cellSelectionSet.add(rowIndex, columnIndex); 
      } 
      else { 
       cellSelectionSet.clear(); 
       cellSelectionSet.add(rowIndex, columnIndex); 
      } 
      } 
     } 
     }; 

public ColorSelectedTableCells() { 
    table.setDefaultRenderer(Integer.class, myCellRenderer); 
    table.setCellSelectionEnabled(true); 
    table.setColumnSelectionAllowed(false); 
    table.setRowSelectionAllowed(false); 

    JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    JPanel btnPanel = new JPanel(); 
    btnPanel.add(btn); 

    setLayout(new BorderLayout()); 
    add(scrollPane, BorderLayout.CENTER); 
    add(btnPanel, BorderLayout.SOUTH); 

    btn.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     myCellRenderer.setShowSelected(true); 
     table.repaint(); 
    } 
    }); 
} 

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(PREF_WIDTH, PREF_HEIGHT); 
} 

private static void createAndShowUI() { 
    JFrame frame = new JFrame(); 
    frame.getContentPane().add(new ColorSelectedTableCells()); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    java.awt.EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     createAndShowUI(); 
    } 
    }); 
} 

Класс MyCellRenderer.java

private static class MyCellRenderer extends DefaultTableCellRenderer { 
    private boolean showSelected = false; 
    private byte colorSwitcher; 

    public void setShowSelected(boolean showSelected) { 
    this.showSelected = showSelected; 
    } 

    public void setColorSwitcher(byte colorSwitcher){ 
     this.colorSwitcher = colorSwitcher; 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table,Object value, boolean isSelected, boolean hasFocus, int row,int column) { 
    Component superComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

     if(showSelected && table.isCellSelected(row, column)){ 
     superComponent.setBackground(Color.GREEN); 
     } 
     else if (table.isCellSelected(row, column)){ 
     superComponent.setBackground(table.getSelectionBackground()); 
     } 
     else { 
     superComponent.setBackground(table.getBackground()); 
     } 
     return superComponent; 
    } 
    } 
} 

Класс cellSelectionSet.java

public class CellSelectionSet { 
    private List<Cell> cells = new ArrayList<>(); 

    public void add(int r, int c) { 
    if (!contains(r, c)) { 
     cells.add(new Cell(r, c)); 
    } 
    } 

    public boolean containsOneOrLess() { 
    return cells.size() <= 1; 
    } 

    public boolean contains(int r, int c) { 
    for (Cell cell : cells) { 
     if (cell.is(r, c)) { 
      return true; 
     } 
    } 
    return false; 
    } 

    public Cell getElementAt(int i){ 
    return cells.get(i); 
    } 

    public int getSize(){ 
    return this.cells.size(); 
    } 

    public void clear() { 
    cells.clear(); 
    System.out.println("CellSelectionSet cleared."); 
    } 
} 

Класс Cell.java

public class Cell { 
    private int row, column; 

    public Cell(int row, int column){ 
    this.row = row; 
    this.column = column; 
    } 

    public boolean is(int r, int c) { 
    return row == r && column == c; 
    } 
} 

ответ

2

Главная проблема:

table.setDefaultRenderer(Integer.class, myCellRenderer); 

Должно быть

table.setDefaultRenderer(Object.class, myCellRenderer); 

Это позволит получить ваши клетки, чтобы изменить цвет. Но тогда у вас есть проблема, когда после вы нажимаете кнопку, каждая выбранная вами ячейка автоматически меняет цвет, поскольку для свойства showSelected установлено значение true. Кто знает, может быть, так оно и есть.

Еще одна проблема заключается в том, что ячейки остаются в цвете выбора. Проблема, если с вашей контрольной ведомостью

if(showSelected && table.isCellSelected(row, column)){ 

Как только вы сделаете больше выборов, исходные выборы будут очищены. Исправить будет проверка на CellSelectionSet, чтобы узнать, содержит ли он ячейку, но также проверить, был ли он выбран или нет. Что-то вроде

if (cellSelectionSet.contains(row, column) 
        && !cellSelectionSet.getCellAt(row, column).isNewlySelected()) 

Я добавил метод getCellAt к вашему CellSelectionSet

public Cell getCellAt(int row, int column) { 
    Cell c = null; 
    for (Cell cell : cells) { 
     if (cell.is(row, column)) { 
      c = cell; 
     } 
    } 
    return c; 
} 

а также флаг в Cell классе, чтобы проверить, если это newlySelected.По умолчанию верно

class Cell { 

    private boolean newlySelected = true; 

    public boolean isNewlySelected() { 
     return newlySelected; 
    } 

    public void setNewlySelected(boolean newlySelected) { 
     this.newlySelected = newlySelected; 
    } 
} 

При первом добавлении в клетку, он будет вновь установлен и не будет оказывать различный цвет, так как он не проходит проверку

!cellSelectionSet.getCellAt(row, column).isNewlySelected() 

Но при нажатии кнопку, вы перебираете список и устанавливаете для всей ячейки newlySelected значение false.

public void actionPerformed(ActionEvent e) { 
    //myCellRenderer.setShowSelected(true); 
    for (int i = 0; i < cellSelectionSet.getSize(); i++) { 
     cellSelectionSet.getElementAt(i).setNewlySelected(false); 
    } 
    table.repaint(); 
} 
+0

Вы экономите меня! Но теперь у меня другая проблема. Выбранные ячейки меняют цвет, но когда я выбираю другую ячейку, все предыдущие возвращаются к белому («unselected»). Не могли бы вы рассказать мне, как я могу это исправить? –

+0

См. Мое обновление. Я думаю, что он работает так, как вы не хотите –

+0

Ячейки все еще возвращаются к «невыделенным», когда я выбираю другую ячейку. Я должен изменить флаг внутри 'if (cellSelectionSet.contains (строка, столбец) &&! CellSelectionSet.getCellAt (строка, столбец) .isNewlySelected()) 'statement? –

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

  • Нет связанных вопросов^_^