Я хочу создать 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;
}
}
Вы экономите меня! Но теперь у меня другая проблема. Выбранные ячейки меняют цвет, но когда я выбираю другую ячейку, все предыдущие возвращаются к белому («unselected»). Не могли бы вы рассказать мне, как я могу это исправить? –
См. Мое обновление. Я думаю, что он работает так, как вы не хотите –
Ячейки все еще возвращаются к «невыделенным», когда я выбираю другую ячейку. Я должен изменить флаг внутри 'if (cellSelectionSet.contains (строка, столбец) &&! CellSelectionSet.getCellAt (строка, столбец) .isNewlySelected()) 'statement? –