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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JScrollPane и ScrollPane, имеют проблемы, Глюки работы компонентов 
:(
    Опции темы
Lisus
Дата 21.10.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ХОЧУ:
Сделать собственный компеонент-такблицу. Существующие компеоненты меня не устраивают. Минимальные требования, что должен делать компонент - это окно с файлами тоталКомандера. Но вобщем не в этом дело.

Проблема:
Естественно, что мой компонент будет содержать полосы прокрытки (далее скролы), простейшим решением является использование ScrollPane \ JScrollPane.
Всё бы хорошо, но у первого компонента есть дефект. при изменении размера внутреннего компонента (доб\удал строк таблицы) нужно переустанавливать размер внутреннего компонента, а затем вызывать doLayout для реагирования на эти изменения ScrollPane. Однако при выполнении последней операции происходит "сдвиг", что делает сам компонент дёргующимся. И выглядет не красиво. Вот код: Для проверки нажмите клавишу.

Код

package test;

import java.awt.*;
import javax.swing.*;

public class ScrollPanelTestRect extends JFrame {
    public ScrollPanelTestRect() {
    }

    public static void main(String[] args) {
        ScrollPanelTestRect sc = new ScrollPanelTestRect();
        sc.getContentPane().add(new spyy());

        sc.setBounds(0, 0, 400, 400);
        sc.show();
    }
}

class spyy extends ScrollPane {
    spxx xx = new spxx();

    public boolean keyDown(Event ev, int code) {
        this.doLayout();
        xx.repaint();
        System.out.println("OKE");
        return true;
    }

    public spyy() {
        for (int i = 0; i < 50; i++) {
            xx.add(new Button("Super start 123456789 abcde 123456789"));
        }

        this.add(xx); //getViewport()
        this.setBounds(0, 0, 398, 398);
        xx.doLayout();
        xx.repaint();
    }
}

class spxx extends Panel {
    int s = 0;

    /* public Dimension getPreferredSize()
     {return new Dimension(700,1000);} */

    public void paint(Graphics g) {
        g.drawLine(0, 0, 300, 300);
        g.drawLine(300, 0, 0, 300);

        System.out.println(s + "  Clip " + g.getClipRect());
        s++;
    }
}


Попробывал найти понимание у JScrollPane. У него всё работает нормально, но есть другой дефект. При появлении одновременно 2-х скролов внутренний компонент "Налезает" на них, и закрывает собой. Т.е. если размер скрола 420, 420   толштна скролПолос 20 и размер внутреннего компонента 500,500. То при значениях полосс 0%, 0% (на экране виден левый верхний угол внутренего элемента) обе полосы прокрытки не видны. если опустить вертикальную полосу прокрутки в 100%, т.е.изображение подымется на 100 пикселей, тогда будет видна нижняя полоса прокрутки... и т.д. По логике полосы прокрутки должны быть выше (а не ниже) Viewport().

Что это? Глюк, недоработка или неполадкт в моей версии ДЖАВА? Код почти тотже, только заменен на Jверсию СкроллПане

Очень не хочется писать собственную реализацию понели прокрутки, помогите и объясните, что не так.
PM MAIL   Вверх
w1nd
Дата 22.10.2007, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



Тест запустил, ни одного из описанных глюков не наблюдал. Java 1.5.0


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Lisus
Дата 23.10.2007, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А в чем может быть проблема?
Сменил JBuilder нак JIdea  и тоже самое.

Глюк в первом случае - это 
двигаете ползунок, чтобы крестик был (большой крестик) нак границе и нажимаете кнопку,
будет видно смещение.

Во втором случае сокракщаете размер ФРЕЙМА до размера скакжем 200, 15
По логиаке должнак появиться правая полосак прокрутки.
Вместо этого часть панели заграждает нижную прокрутку.

Что может быть??? Для более подробного и удобного анализа я создал файл http://upload.com.ua/get/900004295

Таам есть какртинаки дефектов, и ещё один дефект, когда вместо Panel я заменил на JPanel и устакновил лучший размер 700,1000 , такм вообще акнопки на скролы налезают

В какждом случае есть ждар файл, он то по логике вообще должен быть свободен от версии, плиз протестите....
PM MAIL   Вверх
w1nd
Дата 24.10.2007, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


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

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



Отличия - у меня windows 2000. Рекомендации:
  • Не смешивайте компоненты AWT и Swing, используйте какой-то один набор.
  • Компонент JScrollPane реагирует на изменение preferredSize компонент.
  • Вызывать repaint() и doLayout() до отрисовки (например, в конструкторе) совершенно бессмысленно; вместо doLayout() для swing-компонентов нужно вызывать revalidate(). Для корректной работы стандартных компонент с ScrollPane/JScrollPane вручную вызывать ни один из этих методов не требуется.
  • Для переопределении метода рисования swing-компонента нужно замещать метод paintComponent(), а не paint().
Исправленный пример:
Код
import java.awt.*;
import javax.swing.*;

public class ScrollPanelTestRect extends JFrame {
    public ScrollPanelTestRect() {
    }
    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel(
                UIManager.getSystemLookAndFeelClassName()
            );
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        
        ScrollPanelTestRect sc = new ScrollPanelTestRect();
        sc.getContentPane().add(new spyy());
        sc.setSize(400, 400);
        sc.setLocationRelativeTo(null);
        sc.show();
    }
}

class spxx extends JPanel {
    spxx() {
        s = 0;
    }
    public void paintComponent(Graphics g) {
        int w = getWidth(), h = getHeight();
        g.clearRect(0, 0, w, h);
        g.drawLine(0, 0, w, h);
        g.drawLine(w, 0, 0, h);
        s++;
    }
    int s;
}

class spyy extends JScrollPane {
    public spyy() {
        xx = new spxx();
        xx.setBackground(Color.blue);
        xx.setPreferredSize(new Dimension(700, 1000));
        for (int i = 0; i < 50; i++)
            xx.add(new JButton("Super start 123456789 abcde 123456789"));

        getViewport().add(xx);
        setBounds(0, 0, 398, 398);
    }
    spxx xx;
}



Это сообщение отредактировал(а) w1nd - 24.10.2007, 00:21


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Lisus
Дата 24.10.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



пасибо...

Счас буду с напеисанным разбираться
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.0427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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