Нимб и цвета альтернативных рядов

Я неЯ не понимаю, как в Nimbus работает альтернативная раскраска строк. Кажется просто сумасшедшим !!! Я хотел бы прояснить ситуацию здесь.

Для демонстрации, давайтескажи чтомы хотим JTable, который чередует красный и розовый ряды (и я невсе равно какой цвет будет первым).

Без переопределения пользовательских cellRenderers которые выполняют свои собственныепо модулю 2 " вещь, и без переопределения любого метода из JTable, я хочу перечислить обязательные шаги между запуском 's приложение и получение JTable с пользовательскими цветами альтернативных строкиспользуя только свойства Nimbus.

Вот шаги, которые я ожидал выполнить:

Установите Нимб PLAFНастройте "Table.background» имущество нимбаНастройте "Table.alternateRowColor» имущество нимбаСоздайте JTable с простыми данными / заголовкомОберните jTable в JScrollPane и добавьте его в JFrameПоказать JFrame

Вот исходный код:

public class JTableAlternateRowColors implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new JTableAlternateRowColors());
    }

    @Override
    public void run() {
        try {
            UIManager.setLookAndFeel(new NimbusLookAndFeel());
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }

        UIManager.getDefaults().put("Table.background", Color.RED);
        UIManager.getDefaults().put("Table.alternateRowColor", Color.PINK);

        final JFrame jFrame = new JFrame("Nimbus alternate row coloring");
        jFrame.getContentPane().add(new JScrollPane(new JTable(new String[][] {
                {"one","two","three"},
                {"one","two","three"},
                {"one","two","three"}
        }, new String[]{"col1", "col2", "col3"}
        )));
        jFrame.setSize(400, 300);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.setVisible(true);
    }
}

Это код JDK6. Может кто-нибудь сказать мне, что здесь идет не так?

Согласно @kleopatra 's комментарий и вклад всего сообщества здесьs a / способ получить альтернативную раскраску строк, используя только свойства Nimbus

открытый класс JTableAlternateRowColors реализует Runnable {}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new JTableAlternateRowColors());
}

@Override
public void run() {
    try {
        UIManager.setLookAndFeel(new NimbusLookAndFeel());
    } catch (UnsupportedLookAndFeelException e) {
        e.printStackTrace();
    }

    UIManager.put("Table.background", new ColorUIResource(Color.RED));
    UIManager.put("Table.alternateRowColor", Color.PINK);
    UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background", new ColorUIResource(Color.RED));

    final JFrame jFrame = new JFrame("Nimbus alternate row coloring");
    final JTable jTable = new JTable(new String[][]{
            {"one", "two", "three"},
            {"one", "two", "three"},
            {"one", "two", "three"}
    }, new String[]{"col1", "col2", "col3"});
    jTable.setFillsViewportHeight(true);
    jFrame.getContentPane().add(new JScrollPane(jTable));
    jFrame.setSize(400, 300);
    jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    jFrame.setVisible(true);
}

 kleopatra22 окт. 2012 г., 11:31
какие пойдет не так?
 Pigelvy22 окт. 2012 г., 12:38
@DenisTulskiy Не иметь рядов, чередующихся между красным и розовым, на самом деле неправильно. Это'Я или Нимбус, но один из нас не прав!
 Denis Tulskiy22 окт. 2012 г., 12:56
@Pigelvy: о нетНе замечаю, что фон должен быть красным, для меня он был белым.
 mKorbel22 окт. 2012 г., 13:32
@Pigelvy Я был более чем конкретен, первые два пункта - это правильные способы, вы интересовались исследованиями, все на этом форуме, Renderer работает во всех случаях, уверен, что ограничения могут быть реализованы на API (вид 1sr) (ничего плохого, ошибки, ни баги использовать рендерер только для рендеринга)
 Pigelvy22 окт. 2012 г., 12:46
@mKorbel Моя цель - получить четкое руководство о том, что нужно сделать, чтобы иметь правильные альтернативные цвета с Nimbus. Если вы знаете, как изменить мой образец, чтобы он работал,пожалуйста, будьте конкретны.
 kleopatra22 окт. 2012 г., 13:48
Не иметь рядов, чередующихся между красным и розовым, на самом деле неправильно добавьте это предложение к вашему вопросу, хрустальные шары, как известно, ненадежны по утрам в понедельник ;-)
 Pigelvy22 окт. 2012 г., 14:33
@mKorbel Просто чтобы вы знали: я ищу снова и снова, я отлаживал через Nimbus / Synth (DefaultTableCellRenderer, SynthTableUI, ...) и экспериментировал с ColorUIResource вместо Color. Все это без успеха. Тот'это причина, по которой яЯ спрашиваю сообщество. Единственное правильное решение этой проблемы будет включать только свойства Nimbus
 Denis Tulskiy22 окт. 2012 г., 15:39
Единственный цвет, который работает сTable.background розовый. Разработчики Nimbus любят модные :)
 mKorbel22 окт. 2012 г., 12:04
нет там ничего сумасшедшего, надо признать, что все Randerers работают без ограничений (для работы, в которой Renderer реализован в API), для UIManager нужно переопределить proeprs Key (s) в Nimbus Default, конечно, иногда Color, где-то Painter, проблема может быть только с XxxUIResouces (в основном не имеет ничего общего с вопросами 1-8), все ключи правильно описаны ..., кстати, добрые формы в вопросе, особенно пункты 1-8 - отличные дополнения для vWorker.com
 Denis Tulskiy22 окт. 2012 г., 12:58
в таких случаях мне обычно приходилось копаться в исходном коде Nimbus, чтобы увидеть, как он рисует вещи. Я'Я рекомендую вам совершить это удивительное путешествие тоже :)
 mKorbel22 окт. 2012 г., 15:09
@Pigelvy (все, что касается глючных - это сильные слова), здесь вы также должны переопределить основные цвета нимба, принять, что JTable является составным JComponets, Nimbus - это coumpond L &F, тогда вы должны переопределить детей, не так лисделать это, используйте SeaGlass, создайте собственный инжектор цвета, нечтобы сделать это, JTable.setBackground работает, неЧтобы это сделать, используйте Renderer, используйте Rendere по причине, которая создана. Нет проблем, говоря о концепциях Renderer, нужно проверить, возвращает ли UIManager значение null ???, для всех JComponents, где Renderer реализован в API.
 Denis Tulskiy22 окт. 2012 г., 11:44
Ничто не идет не так Код работает нормально для меня, за исключением того, что с jdk6 первая и третья строки розовые, а с jdk7 только вторая.

Ответы на вопрос(2)

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

UIManager.put("Table.alternateRowColor", Color.PINK);
UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background", Color.RED);

В качестве альтернативы:

продолжаетсяJTable и переопределяетprepareRenderer(TableCellRenderer renderer, int row, int column) для того чтобы покрасить клетки нужным цветом (RED а такжеPINK).

Вот короткий пример, я надеюсь, что это поможет.

Дополнительная функция: Это также переопределяетpaintComponent(..) который позвонитpaintEmptyRows(Graphics g) который будет рисовать строки на всю высоту и ширинуJScrollPane область просмотра, однако это применимо только еслиsetFillsViewPortHeight установлен вtrue на :MyTable

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;
import javax.swing.table.TableCellRenderer;

public class JTableAlternateRowColors {

    public JTableAlternateRowColors() {
        initComponents();
    }

    public static void main(String[] args) {

        try {
            UIManager.setLookAndFeel(new NimbusLookAndFeel());
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JTableAlternateRowColors();
            }
        });
    }

    private void initComponents() {

        final JFrame jFrame = new JFrame("Nimbus alternate row coloring");

        MyTable table = new MyTable(new String[][]{
                    {"one", "two", "three"},
                    {"one", "two", "three"},
                    {"one", "two", "three"}
                }, new String[]{"col1", "col2", "col3"});

        table.setFillsViewportHeight(true);//will fill the empty spaces too if any

        table.setPreferredScrollableViewportSize(table.getPreferredSize());

        JScrollPane jScrollPane = new JScrollPane(table);

        jFrame.getContentPane().add(jScrollPane);
        jFrame.pack();
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.setVisible(true);
    }
}

class MyTable extends JTable {

    public MyTable(String[][] data, String[] fields) {
        super(data, fields);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        if (getFillsViewportHeight()) {
            paintEmptyRows(g);
        }
    }

    /**
     * Paints the backgrounds of the implied empty rows when the table model is
     * insufficient to fill all the visible area available to us. We don't
     * involve cell renderers, because we have no data.
     */
    protected void paintEmptyRows(Graphics g) {
        final int rowCount = getRowCount();
        final Rectangle clip = g.getClipBounds();
        if (rowCount * rowHeight < clip.height) {
            for (int i = rowCount; i <= clip.height / rowHeight; ++i) {
                g.setColor(colorForRow(i));
                g.fillRect(clip.x, i * rowHeight, clip.width, rowHeight);
            }
        }
    }

    /**
     * Returns the appropriate background color for the given row.
     */
    protected Color colorForRow(int row) {
        return (row % 2 == 0) ? Color.RED : Color.PINK;
    }

    /**
     * Shades alternate rows in different colors.
     */
    @Override
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component c = super.prepareRenderer(renderer, row, column);
        if (isCellSelected(row, column) == false) {
            c.setBackground(colorForRow(row));
            c.setForeground(UIManager.getColor("Table.foreground"));
        } else {
            c.setBackground(UIManager.getColor("Table.selectionBackground"));
            c.setForeground(UIManager.getColor("Table.selectionForeground"));
        }
        return c;
    }
}

Рекомендации:

http://elliotth.blogspot.com/2004/09/alternating-row-colors-in-jtable.htmlJTable с полосатым фоном
 mKorbel22 окт. 2012 г., 13:29
+1 prepateRenderer и добавление уведомления о convertXxxXxx для сортировки или фильтрации
 mKorbel22 окт. 2012 г., 15:29
 Pigelvy22 окт. 2012 г., 13:36
FillViewPortHeight очень приятный и отточенный (мне это нравится), но этоне тема здесь, поэтому я выигралкомментировать это ...
 mKorbel22 окт. 2012 г., 15:25
@ Дэвид Кроукамп глючит или нет, разработка закончилась в 1-м / 2-м квартале, это L &F о теме цветов, а не об аквариуме, полном отдельных сверкающих рыб, есть несколько XML-файлов для сверкающих цветовых схем, а затемt требуется Nimbus # uinstallUI для нескольких глючных ключей, которые имеют нулевое значение, разрешены по умолчанию и (short_cuts) используются для концепции рендерера
 David Kroukamp22 окт. 2012 г., 13:52
@Pigelvy, кроме всех дополнений, все, что нужно сделать, это переопределитьprepareRenderer(...) изJTable не расширяются все сторонние таблицыJTable? таким образом будет реализовыватьprepareRenderer(...)
 mKorbel22 окт. 2012 г., 14:33
@ Дэвид Кроукамп, если я тот, кто докажет это?не в состоянии
 kleopatra22 окт. 2012 г., 14:59
@Pigelvy, если вам нужно выразить свое разочарование в крике, пожалуйста, сделайте это в направлении Oracle: NimbusЯВЛЯЕТСЯ глючит!
 Pigelvy22 окт. 2012 г., 14:36
@DavidKroukamp Если они не ожидали, что мы будем чередовать "Table.background» а также "Table.alternateRowColor»Может кто-нибудь объяснить мне код в javax.swing.plaf.synth.SynthTableUI # paintCell?
 David Kroukamp22 окт. 2012 г., 14:34
@mKorbel;) Я гулял сзначения по умолчанию для таблицы в Nimbus но никаких результатов, однако, я мог что-то пропустить, следовательно, 2%
 Pigelvy22 окт. 2012 г., 14:15
@DavidKroukamp Сторонние организации расширяют JTable, но как расширить JTable, встроенный в иерархию JComponent? Как продлить итоговый класс? Как вы справляетесь с запутанным кодом? Как вы обрабатываете JTables, предоставляемые плагинами? Я знаю, как чередовать цвета. Я'мы уже сделали это Я'извините, я могуне принимаю ваш ответНо я могу быть удовлетворен только решением, которое работает только со свойствами Nimbus, Если это невозможно, то Nimbus - это чушь! Тот'так просто! В противном случае, зачем ему предоставлять недвижимость?Table.alternateRowColor»????
 David Kroukamp22 окт. 2012 г., 15:22
@Pigelvy Kleopatra права (+1 к ее комментарию). Смотрите мой обновленный ответ.
 Pigelvy22 окт. 2012 г., 13:44
FillViewPortHeight очень приятный и отточенный (мне это нравится), но этоне тема здесь, поэтому я выигралНе комментируйте ... Что важно, так это то, что я нене хочу | не может] расширить JTables для всего приложения. Некоторые JTables создаются сторонними библиотеками, и представленное вами решение не подлежит сопровождению. Я хочу, чтобы стиль был независимым и ответственность PLAF (как CSS). То, как я вижу вещи (и скажите мне, если ям неправильно),цвета должны / должны быть определены только в Nimbus, Но как???? тот'С вопросом!
Решение Вопроса

Похоже, вмешательство нескольких ошибок ...

Для изменения как фона таблицы по умолчанию, так и чередования по умолчанию ожидаемая (не только ваша, а также моя) конфигурация UIManager (одинаковая для всех LAF, которые относятся к свойству alternateRow) должна быть:

UIManager.put("Table.background", Color.RED);
UIManager.put("Table.alternateRowColor", Color.PINK);

Безразлично»не работает ни для металла, ни для Nimbus

в металле: без полос, стол весь красныйв Нимбусе: полосатый белый / розовый, то есть фон таблицы игнорируется

Основная причина первого может быть найдена в DefaultTableCellRenderer:

Color background = unselectedBackground != null
                        ? unselectedBackground
                        : table.getBackground();
if (background == null || background instanceof javax.swing.plaf.UIResource) {
    Color alternateColor = DefaultLookup.getColor(this, ui, "Table.alternateRowColor");
    if (alternateColor != null && row % 2 != 0) {
        background = alternateColor;
    }
}

Это'S логика изогнута: альтернативный цвет берется только еслиТаблица's background - это colorUIResource, довольно слабое различие. Во всяком случае, это приводит нас к следующей попытке:

UIManager.put("Table.background", new ColorUIResource(Color.RED));
UIManager.put("Table.alternateRowColor", Color.PINK);

Это выглядит хорошо (за исключением типичной проблемы с рендером флажка, но это 'Еще одна история с багом ;-) для металла, но Нимбусу не повезло.

Следующий шаг - поискNimbus по умолчанию что может быть связано, и применить (после! настройки LAF):

UIManager.getLookAndFeelDefaults().put("Table:\"Table.cellRenderer\".background", 
    new ColorUIResource(Color.RED));

редактировать (как было сказано в комментариях)

JXTable пытается полностью обойти проблему - ее средством для чередования является Highlighter, полученный из HighlighterFactory. Нужно испачкаться в Nimbus, удалив свойство alternateRowColor из lookAndFeelDefaults и добавив его с новым ключом "UIColorHighlighter.stripingBackground»

 David Kroukamp22 окт. 2012 г., 15:31
+1 поздравляю, у вас все получилось :). 1 вопрос, почему это не работает, потому что я попробовал это сначала, но не повезло, как вы можете видеть:UIManager.getDefaults().put("Table:\"Table.cellRenderer\".background", Color.RED);
 kleopatra22 окт. 2012 г., 16:30
@Robin JXTable пытается игнорировать настройку (и нене слишком старайся справиться с нимбом,просто глючит)
 WesternGun25 мая 2017 г., 16:50
Что если я хочу изменить только на каждом уровне JTable? В случае, если я хочу установить различный фон для каждой таблицы.
 Robin22 окт. 2012 г., 15:46
@mKorbel это описано очень хорошо, но требует определенного количества отладки, чтобы обнаружить что-то, что должно быть почти тривиальным вариантом использования. Таблицы с чередующимися цветами строк - довольно основное требование при разработке таблицы.
 mKorbel22 окт. 2012 г., 15:37
@David Kroukamp см. Мой пост здесь (+1 для основных вещей)
 mKorbel22 окт. 2012 г., 15:40
@Robin Я вижу там только проблему с переопределением Key в UIManager, очень хорошо описанную в этом ответе.
 Pigelvy22 окт. 2012 г., 16:35
Я пахну как приемлемое решение здесь! Очень хорошо @kleopatra = D. Я немного протестировал, и 3 свойства, о которых вы говорите, могут быть установлены после установки Nimbus (что на самом деле хорошо для меня, потому что мы устанавливаем Nimbus, используя "swing.defaultlaf» системное свойство). Я'Я дополню мой оригинальный пост полным примером с использованием вашего решения. Я неНе знаю, приведет ли это к регрессу, но я думаю, что мымы добились хорошего прогресса в этом вопросе. Спасибо всем!!
 Robin22 окт. 2012 г., 15:39
И получаете ли вы все эти взломы бесплатно, если вы используетеSwingX и его маркеры? У меня никогда не возникало проблем с созданием чередующихся цветов строк, но я не пользуюсь стандартнымJTable

Ваш ответ на вопрос