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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JTable.paintComponent(), пустая модель и paint 
V
    Опции темы
MAXIMUS00
Дата 15.4.2010, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем доброго времени суток!
Суть дела:
Есть класс, унаследованный от  JTable. в нём переопределён метод paintComponent():
Код

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    paintButton(g);
}

, в котором дёргается мой метод:
Код

private void paintButton(Graphics g) {
    Graphics2D g2 = (Graphics2D) g.create();
    Image img = ...
    ....
    g2.drawImage(img, x, y, this);
    g2.dispose();
}


Всё это нужно вот для вот такой кнопульки:
user posted image

Проблема:
Когда в таблицу пихается пустая модель, для таблицы метод paint не вызывается, а соответственно не вызывается и мой метод (

Прошу подкинуть идей для решения этого вопроса.

PM MAIL   Вверх
pathfinder
Дата 15.4.2010, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Переопредили метод setModel. Если задается пустая модель то устанавливай prefferedSize() у таблицы равный высоте твоей кнопки и желаемой ширине(бери ее из JScrollPane.getViewport().getWidth(), в которую у тебя вставлена таблица). Дополнительно нужно будет следить и за моделью, когда она становится пустой те же действия, что и при установке пустой модели.

Пример
Код

import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author ramil
 */
public class JTableFrame extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JTableFrame().setVisible(true);
            }
        });
    }

    public JTableFrame() {
        super("Решение");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setPreferredSize(new Dimension(600, 400));

        String[] columnNames = {"Column1", "Column2"};
        DefaultTableModel dtm = new DefaultTableModel(columnNames, 0);
        JTable table = new JTable(dtm) {
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                //
                g.drawString(
                        "Хотя модель и пустая, JTable все равно отрисовывается",
                        30, 30);
            }
        };
        
        int buttonHeight = 100;
        table.setPreferredSize(
                new Dimension(scrollPane.getViewport().getWidth(), buttonHeight));

        scrollPane.setViewportView(table);
        add(scrollPane);
        pack();
        setLocationRelativeTo(null);
    }

}

PM MAIL   Вверх
MAXIMUS00
Дата 15.4.2010, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



tnx! ща буду лабать. что-то должно получиться smile
PM MAIL   Вверх
pathfinder
Дата 15.4.2010, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пример слегка не правильный. 

Т.к. preferredSize задается жестко, то размер таблицы в дальнейшем не будет изменятся. Поэтому в дополнение к выше написаному: если в модель были добавлены строки обязательно вызвать preferredSize(null) у таблицы, что-бы JScrollPane брал preferredSize у UI таблицы, а не тот что был задан вручную.


PM MAIL   Вверх
MAXIMUS00
Дата 15.4.2010, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



как раз на это напоролся ) ну эти все мелочи я как-то поборю. главное, я знаю теперь, в какую сторону смотреть.
СЕНКС БОЛЬШОЙ, КАК ЭТИ БУКВЫ.

Добавлено через 8 минут и 40 секунд
адаптировал твой пример под свою задачу - всё супер. метод вызывается. только моя кнопулька рисуется ПОД табличкой, а не НА ней. поэтому я сделал так : setPreferredSize(new Dimension(sp.getViewport().getWidth(), 1));

теперь решаю другой вопрос - скролл появляется, если табличка вылазит за пределы viewport. А мне надо учесть ещё и кнопку. *чешу в затылке*

в любом случае тема решена. спасибо.

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

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

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


 




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


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

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