Изменение цвета ячейки Swing JTable - PullRequest
5 голосов
/ 25 августа 2011

Я пытаюсь освоиться с JTables, TableModels, JTableHeaders, средствами визуализации и т. Д. Я пытаюсь создать простую фиктивную таблицу (для практических целей), которая выглядит следующим образом:

-    1    2   3
A    A1   A2  A3
B    B1   B2  B3
C    C1   C2  C3

Я также хочу, чтобы ячейка B2 - и только эта ячейка - имела синий фон (Color.BLUE) - все остальные ячейки могут иметь цвет по умолчанию Swing, который они назначают автоматически.

Мой код приведен ниже и основан на бесчисленных примерах, которые я нашел на этом сайте и в Интернете в целом. Но я не получаю желаемых результатов. Вместо этого я получаю таблицу, которая выглядит так:

A    A1   A2  A3
B    B1   B2  B3
C    C1   C2  C3

Обратите внимание, что первая строка (заголовок) вообще отсутствует. Кроме того, с помощью приведенного ниже кода, он выполняется и устанавливает цвет всех ячеек этого цвета, а не только ячейку B2, которую я хочу.

Код :

public class MyTable
{
    public static void main(String[] args)
    {
        String[][] data = getTableData();
        String[] cols = getTableCols();

        JFrame frame = magicallyCreateJFrame();     // I promise this works!
        MyRenderer myRenderer = new MyRenderer();   // See below

        DefaultTableModel defModel = new DefaultTableModel(data, cols);
        JTable myTable = new JTable(defModel);

        myTable.setDefaultRenderer(Object.class, myRenderer);

        frame.add(myTable);
        frame.pack();
        frame.setVisible(true);            
    }
}

public static String[] getTableCols()
{
    String cols =
    {
        "-",
        "1",
        "2",
        "3",
    };
}

public static String[][] getTableData()
{
    String[][] data =
    {
        {
            "A",
            "A1",
            "A2",
            "A3",
        },
        {
            "B",
            "B1",
            "B2",
            "B3",
        },
        {
            "C",
            "C1",
            "C2",
            "C3",
        },
    };

    return data;
}

И быстро-н-грязный MyRenderer класс:

public class MyRenderer extends DefaultTableCellRenderer  
{ 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean   isSelected, boolean hasFocus, int row, int column) 
{ 
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

    if(row == 2 && column == 2)
        c.setBackground(new java.awt.Color(0, 0, 255)); 

    return c; 
} 

} 

Помимо того факта, что это ужасный код и нарушает множество шаблонов и техник типа "передового опыта" (помните, что это просто то, с чем я играю), есть что-нибудь, что я делаю здесь, что является очевидным ? Почему я не получаю заголовок таблицы (первая строка "- 1 2 3")? Почему мой рендерер ячеек по умолчанию не работает с указанной ячейкой B2?

JTables кажутся странными, красивыми и могущественными животными. Я медленно оборачиваюсь вокруг них, но задыхаюсь от реализации. Спасибо всем, кто может помочь!

Ответы [ 5 ]

14 голосов
/ 25 августа 2011

Вы должны убедиться, что вы сбросили рендерер на его цвет фона по умолчанию (и обработать выбор строки):

if (! table.isRowSelected(row))
{
    if(row == 2 && column == 2)
        c.setBackground(new java.awt.Color(0, 0, 255));
    else
        c.setBackground(table.getBackground());
}

В будущем отправьте правильный SSCCE с вашим вопросом.

4 голосов
/ 25 августа 2011

Half-ответ:

Вам нужно поместить JTable в JScrollPane, чтобы отобразить заголовок. Или же вы можете вручную добавить в макет компонент, возвращаемый myTable.getTableHeader(). Я рекомендую использовать JScrollPane, хотя.

EDIT:

Как предлагается ниже, чтобы сделать синий фон только для одной конкретной ячейки, все, что вам нужно сделать, это добавить тест, подобный этому:

if(column == 2 && row == 1) {
    c.setBackground(Color.BLUE); 
} else {
    c.setBackground(Color.WHITE);
}
3 голосов
/ 25 августа 2011

Где вы указываете рендер для цвета B2 и только B2? Возможно, вы хотите поместить блок if в свой метод getTableCellRendererComponent, чтобы цвет фона был синим, только если toString () объекта значения JTable имеет значение B2 или если значения строк и столбцов соответствуют ячейке B2.

И чтобы увидеть заголовок таблицы, вы должны сначала добавить таблицу в JScrollPane, а затем добавить JScrollPane к родительскому элементу.

Самое важное: прочитайте руководства по Swing на JTables, так как все это объяснено там.

0 голосов
/ 25 мая 2015

Я считаю, что правильный способ раскраски таблицы - через ColorHighlighter.Я привел пример здесь .

0 голосов
/ 25 августа 2011

Возможно, myTable.setDefaultRenderer(String.class, myRenderer); будет работать правильно.

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