Ячейки с центрированным значением и фоном на основе значения - PullRequest
0 голосов
/ 06 августа 2020

вот моя проблема, я читаю БД и показываю данные через рендерер. Показанные данные должны быть выровнены по центру, а цвет bgcolor должен изменяться в соответствии со значением ячейки.

Следующее - средство визуализации. Первый table.getColumnModel () показывает центрированное значение, второй вызывает средство визуализации клиента для изменения цвета. Если я удалю комментарий во втором вызове, я получу цвет bgcolor, но не центрированное значение, и наоборот.

for (int row = 0; row < table.getColumnCount(); row++) {
    DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
    centerRenderer.setHorizontalAlignment(JLabel.CENTER);
    table.getColumnModel().getColumn(row).setCellRenderer(centerRenderer);
    //table.getColumnModel().getColumn(row).setCellRenderer(new CustomRenderer()); 
}

Это пользовательский рендерер

class CustomRenderer extends DefaultTableCellRenderer
{
   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
   {
       Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
       if(table.getValueAt(row, column).equals("A")){
           cellComponent.setBackground(Color.YELLOW);
           
       } else if(table.getValueAt(row, column).equals("B")){
           cellComponent.setBackground(Color.GRAY);
       }
       else {cellComponent.setBackground(Color.white);}
           return cellComponent;
     }
}

Как я могу получить цветной и центральная ячейка? Чем вы paps

1 Ответ

0 голосов
/ 06 августа 2020

Вот короткий фрагмент, демонстрирующий, что я думаю, вы пытаетесь достичь:

public class Testing {

public static void main(String args[]) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            new Testing();
        }
    });

}

public Testing() {
    JFrame frame = new JFrame();
    JPanel panel = new JPanel();

    String[] colNames = { "Col1", "Col2" };
    Object[][] data = { { "A", "B" }, { "B", "C" } };

    JTable table = new JTable(data, colNames);
    CustomRenderer renderer = new CustomRenderer();
    renderer.setHorizontalAlignment(JLabel.CENTER);
    // table.setDefaultRenderer(String.class, renderer); // if you want to only
    // color and center all strings
    for (int col = 0; col < table.getColumnCount(); col++) {
        // if you want to color and center every entry of the table
        table.getColumnModel().getColumn(col).setCellRenderer(renderer);
    }
    panel.add(table);
    frame.add(panel);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
}

class CustomRenderer extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        Component cellComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        
        cellComponent.setBackground(Color.white); // white if not "A" or "B"
        if (value instanceof String) {
            String temp = (String) value;
            if (temp.equals("A")) {
                cellComponent.setBackground(Color.YELLOW);
            } else if (temp.equals("B")) {
                cellComponent.setBackground(Color.GRAY);
            }
        }
        return cellComponent;
    }
}
}

Результат будет выглядеть так:

введите описание изображения здесь

Обратите внимание, что ваш пользовательский рендерер должен быть создан только один раз, а не каждые l oop. Проблема в вашем коде заключалась в том, что вы использовали не свой собственный рендерер, а DefaultTableCellRenderer. Кроме того, если вы хотите использовать пользовательский рендеринг только для определенного типа класса c, например только для String объектов, вы можете использовать закомментированную строку вместо повторения по всем столбцам таблицы. И, конечно же, вы можете добавить дополнительные ограничения к CustomRenderer в соответствии с вашими потребностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...