Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTable и Default Table Header 
V
    Опции темы
Ccoder
  Дата 13.8.2011, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.2.2011

Репутация: нет
Всего: нет



Здравствуйте.

Хочу спросить по следующему моменту. Трудно разобраться.


Хочу сделать в JTable таблице один заголовок с JCheckBox'ом
Выглядеть он должен примерно вот так
user posted image
а при наведении курсора вот так
user posted image
(используя LookAndFeel с "Windows")


Значит что мне тут трудно найти. То это то место где стандартный TableHeaderRender рисует это всё дело.
Насколько я себе представляю. Должно быть такое место где берётся чистая прямоугольная область, далее на неё кладёться какимто образом вот такой рисунок
user posted image который получается если чередовать user posted image
Далее рисуется поверх текст

Ну в принципе зачем писать весь компонент. Ведь там реализовано перетягивание, изменение размера колонки и т.д.
Хотелось-бы просто добавить туда checkbox

Добавлено @ 09:10
Кто-нибудь понимает что там делается, как это всё дело рисуется?

Это сообщение отредактировал(а) Ccoder - 13.8.2011, 09:10
PM MAIL   Вверх
Ccoder
Дата 13.8.2011, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.2.2011

Репутация: нет
Всего: нет



Вот такое место бы найти где рисуеться
Код

"TableHeader:\"TableHeader.renderer\"[Enabled].backgroundPainter"

PM MAIL   Вверх
Ccoder
Дата 13.8.2011, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.2.2011

Репутация: нет
Всего: нет



Слушайте может хоть кто хоть немного просветит

Значит есть cellRenderer и HeaderRenderer у которых тип класса одинаковый DefaultTableCellRenderer.java.
В нём есть место где рисуются клетки
Код

    public Component getTableCellRendererComponent(JTable table, Object value,
                          boolean isSelected, boolean hasFocus, int row, int column) {

        Color fg = null;
        Color bg = null;

        JTable.DropLocation dropLocation = table.getDropLocation();
        if (dropLocation != null
                && !dropLocation.isInsertRow()
                && !dropLocation.isInsertColumn()
                && dropLocation.getRow() == row
                && dropLocation.getColumn() == column) {

            fg = DefaultLookup.getColor(this, ui, "Table.dropCellForeground");
            bg = DefaultLookup.getColor(this, ui, "Table.dropCellBackground");

            isSelected = true;
        }

        if (isSelected) {
            super.setForeground(fg == null ? table.getSelectionForeground()
                                           : fg);
            super.setBackground(bg == null ? table.getSelectionBackground()
                                           : bg);
    } else {
            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;
            }
            super.setForeground(unselectedForeground != null
                                    ? unselectedForeground
                                    : table.getForeground());
            super.setBackground(background);
    }

    setFont(table.getFont());

    if (hasFocus) {
            Border border = null;
            if (isSelected) {
                border = DefaultLookup.getBorder(this, ui, "Table.focusSelectedCellHighlightBorder");
            }
            if (border == null) {
                border = DefaultLookup.getBorder(this, ui, "Table.focusCellHighlightBorder");
            }
            setBorder(border);

        if (!isSelected && table.isCellEditable(row, column)) {
                Color col;
                col = DefaultLookup.getColor(this, ui, "Table.focusCellForeground");
                if (col != null) {
                    super.setForeground(col);
                }
                col = DefaultLookup.getColor(this, ui, "Table.focusCellBackground");
                if (col != null) {
                    super.setBackground(col);
                }
        }
    } else {
            setBorder(getNoFocusBorder());
    }

        setValue(value); 

    return this;
    }



А где рисуется Header такого места нету.

Если начать копать глубже, то выясняется что стандартный header на самом деле использует другой класс. Только какой?

P.S.
Ведь column.getHeaderRenderer() в стандартном случае null
PM MAIL   Вверх
dorogoyIV
Дата 13.8.2011, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



TableHeader

там JTextField, но никто не запрещает тебе сделать любой другой компонент ;)
PM MAIL   Вверх
Ccoder
Дата 13.8.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.2.2011

Репутация: нет
Всего: нет



Цитата(dorogoyIV @  13.8.2011,  11:55 Найти цитируемый пост)
там JTextField, но никто не запрещает тебе сделать любой другой компонент ;) 

мм не. тут рисуется компонент поверх....

Добавлено @ 12:37
Мне уже просто даже ради "спортивного интереса" интересно как-же работаю классы WindowsTableHeaderUI.java BasicTableHeaderUI.java XPStyle.java
вот это я хотел-бы понять

Это сообщение отредактировал(а) Ccoder - 13.8.2011, 12:39
PM MAIL   Вверх
dorogoyIV
Дата 13.8.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



тогда свои Renderer + Editor

PM MAIL   Вверх
Ccoder
Дата 13.8.2011, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.2.2011

Репутация: нет
Всего: нет



Цитата(dorogoyIV @  13.8.2011,  12:41 Найти цитируемый пост)
тогда свои Renderer + Editor

Со своим не получается сделать подсветку при наведении курсора.
Вот такая тут ситуация...

Добавлено @ 13:37
Так ну я застрял сейчас на этом коде
Код


        TableColumn column = table.getColumn("Name");
        column.setHeaderRenderer(new TableHeaderIconRenderer(table));


Код

public class TableHeaderIconRenderer extends DefaultTableCellHeaderRenderer
{
    CellRendererPane rendererPane = new CellRendererPane();
    TableCellRenderer cellRenderer;
    JTable table;
    
    public TableHeaderIconRenderer(JTable table)
    {
        add(rendererPane);
        cellRenderer = table.getTableHeader().getDefaultRenderer();
        this.table = table;

    }

    @Override
    public Component getTableCellRendererComponent(JTable tab, Object val, boolean isSelected, boolean hasFocus, int row, int col)
    {
        return cellRenderer.getTableCellRendererComponent(tab, "", isSelected, hasFocus, row, col);    
    }    


}


получаю
Цитата

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at com.sun.java.swing.plaf.windows.WindowsTableHeaderUI$XPDefaultRenderer.paint(WindowsTableHeaderUI.java:152)

ктонибудь понимает в этом что-нибудь?

Добавлено @ 13:41
P.S.

Что я тут пытаюсь сделать. Так это получить заголовок без текста. (при этом он должен рисоваться подсвеченным при наведении курсора)
А после добавлять компоненты наверх : текст с JCheckbox'ом

Добавлено @ 13:44
Кстати
Цитата(Ccoder @  13.8.2011,  12:36 Найти цитируемый пост)
WindowsTableHeaderUI.java BasicTableHeaderUI.java XPStyle.java

нет смысла копать так они сделаны так что-бы нельзя было напрямую обратиться к "шкуркам" (skins)

Это сообщение отредактировал(а) Ccoder - 13.8.2011, 13:46
PM MAIL   Вверх
Ccoder
Дата 13.8.2011, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.2.2011

Репутация: нет
Всего: нет



Я пересмотрел всё что было на google и на этом форуме, но так и ничего ненашел.
Буду рад увидеть хоть что-нибудь

Это сообщение отредактировал(а) Ccoder - 13.8.2011, 15:51
PM MAIL   Вверх
Ccoder
Дата 13.8.2011, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.2.2011

Репутация: нет
Всего: нет



Кстати интересный момент
Вот тут боковой header прорисовывается нормально
Это тут
PM MAIL   Вверх
pathfinder
Дата 13.8.2011, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: 7
Всего: 10



Цитата(Ccoder @  13.8.2011,  16:10 Найти цитируемый пост)
Кстати интересный момент
Вот тут боковой header прорисовывается нормально
Это тут 


Отрисовка background - через дефолтный рендерер, отрисовка содержимого - через прозрачный JCheckBox.

Код

public class WindowsCheckBoxTableHeaderRenderer 
        extends JComponent
        implements TableCellRenderer 
{
    public WindowsCheckBoxTableHeaderRenderer(
            TableCellRenderer tableCellRenderer) 
    {
        this.tableCellRenderer = tableCellRenderer;

        contentPainter = new JCheckBox("Text");
        contentPainter.setOpaque(false);

        add(rendererPane = new CellRendererPane());
        setOpaque(true);

        setSize(contentPainter.getSize());
        setPreferredSize(contentPainter.getPreferredSize());
    }

    @Override
    public Component getTableCellRendererComponent(
            JTable table, 
            Object value, 
            boolean isSelected, 
            boolean hasFocus, 
            int row, 
            int column) 
    {
        backgroundPainter = tableCellRenderer.getTableCellRendererComponent(
                table, "", isSelected, hasFocus, row, column);
        contentPainter.setText(value.toString());
        return this;
    }

    @Override
    public void paintComponent(Graphics g) {
        Rectangle rect = new Rectangle(getSize());
        rendererPane.paintComponent(g, backgroundPainter, this, rect);
        rendererPane.paintComponent(g, contentPainter, this, rect);
        rendererPane.removeAll();
    }

/* Data */
    private TableCellRenderer tableCellRenderer;
    private CellRendererPane rendererPane;
    private Component backgroundPainter;
    private JCheckBox contentPainter;



Использование.
Код

WindowsCheckBoxTableHeaderRenderer headerRenderer = 
        new WindowsCheckBoxTableHeaderRenderer(
                jTable.getTableHeader().getDefaultRenderer());
jTable.getTableHeader().setDefaultRenderer(headerRenderer);

PM MAIL   Вверх
Ccoder
Дата 14.8.2011, 03:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.2.2011

Репутация: нет
Всего: нет



Как я счастлив что разобрался. (уж слишком много мучался)
Взял, попробовал код и понял
Оказывается у меня тут проблема ещё + изза того что я использую
Код

SwingUtilities.updateComponentTreeUI(frame);


pathfinder, СПАСИБО ОГРОМНОЕ!

(поставьте пожалуйста + за меня)

Это сообщение отредактировал(а) Ccoder - 14.8.2011, 03:23
PM MAIL   Вверх
dorogoyIV
Дата 14.8.2011, 04:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(Ccoder @  14.8.2011,  03:23 Найти цитируемый пост)
Как я счастлив что разобрался

осталось только эдитор добавить
Цитата(dorogoyIV @  13.8.2011,  12:41 Найти цитируемый пост)
тогда свои Renderer + Editor


PM MAIL   Вверх
dorogoyIV
Дата 14.8.2011, 04:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0851 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.