Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание JScrollPane

10K
18 ноября 2006 года
ljevik
48 / / 02.10.2006
имею некоторый класс, в нем делаю следующее:
Код:
class GuiFrame extends JFrame {
  JScrollPane scrollPane;
  JPanel drawPanel;
  ...
  GuiFrame() {
    drawPanel = new ExtendedCanvas();
    scrollPane = new JScrollPane(drawPanel);
    add(scrollPane);
    ...
   }
}
class ExtendedCanvas extends Canvas {
  ExtendedCanvas () {
  setBackground(new Color(236, 233, 216));
  }
}

В классе ExtendedCanvas просто происходит рисование. Но там у меня график иногда выходит за пределы панели и я хочу, чтобы в этом случае появлялась ScrollPane, а она ни в этом, ни в каком другом не появляется. Может ли кто-нибудь помочь?? Буду признателен.
17K
19 ноября 2006 года
Victa
16 / / 07.06.2006
При создании JScrollPane вы используете конструктор в котором
"Creates a JScrollPane that displays the contents of the specified component, where both horizontal and vertical scrollbars appear whenever the component's contents are larger than the view." - используются константы HORIZONTAL_SCROLLBAR_AS_NEEDED и VERTICAL_SCROLLBAR_AS_NEEDED. Когда вы создали drawPanel и поместили ее в контейнер, менеджер компоновки рассчитал, какой размер (если вы явно не указываете) и где должен находиться ваша drawPanel. После того, как вы нарисовали график, размер вашей панели не изменился, поэтому контент компонента не стал больше чем чем область просмотра, и скролы не появились. чтобы это произошло, после создания графика нужно пересчитать размеры панели с графиком и явно задать их вызывая drawPanel.setPreferredSize(new Dimension(newWidth, newHeight)). теперь, если размеры вашего компонента будут больше чем область просмотра JScrollPane, скролбары бутут прорисованы.
10K
19 ноября 2006 года
ljevik
48 / / 02.10.2006
Спасибо, а поначалу setPreferredSize используются какие величины? Начальные высота и ширина панели? И еще вопрос, вот у меня реализовано двумя отдельными классами это и если я затем в новом классе пересчитаю размер панели с графиком, то как мне вернуть это значение для scroll pane? Если у меня график рисуется после нажатия на кнопке, нужно ли мне в ActionListner прописывать что-то вроде scrollPane.revalidate()? Извините за столь наивные и глупые вопросы, но почему-то в том учебнике, что я читаю (Core Java 2 Edition) о полосе прокрутке наисана пара строк в случае, если она добавляется к JTeaxtArea, а те примеры, что на sun-овском сайте в tutorial мне не помогли.
17K
20 ноября 2006 года
Victa
16 / / 07.06.2006
Начальные значения рассчитываются менеджером компоновки перед первым выводом на экран. Вы эти значения можете получить вызывая метод getPreferredSize(). После установки нового размера панели нужно вызвать метод revalidate(). Вызывать его можно на scrollPane, но достаточно вызвать и на drawPanel. Передавать значения можно по разному, все зависит от архитектуры вашего приложения. Вы говорите, что перерисовка графиков будет выполняться при нажатии на кнопку - тогда в вашем классе, наследующем панель, можно определить метод, что то вроде getCurrentSize который вернет пересчитанный размер. Но в этом случае нужно использовать ссылку не на базовый класс, а на свой. или приводить перед вызовом. Также можно передавать ссылку на контейнер или на фрейм в конструктор при создании ExtendedCanvas.

Кстати, в строке drawPanel = new ExtendedCanvas() будет ошибка приведения типа. Или вы используете собственный класс Canvas?
10K
23 ноября 2006 года
ljevik
48 / / 02.10.2006
:confused: Все равно не получается. По такой логике, как вы сказали, я пробую сначала выставить размер моей панели, а затем просто изменить его на любой другой, произвольный, чтобы с графиком влезло. Тоесть вот так:
 
Код:
scrollPane.setPreferredSize(new Dimension(drawPanel.getPreferredSize()));
add(scrollPane, BorderLayout.CENTER);

public void actionPerformed(ActionEvent e) {
...
drawPanel.setPreferredSize(new Dimension(1000,400));
scrollPane.revalidate();
drawPanel.repaint();
}


чего-то я, наверно не понимаю...:) Здесь
http://www.tud.ttu.ee/~t050679/DataBase.java сурсы моей программы и если у вас будет время и желние, можете посмотреть, почему не получается, я был бы вам очень признателен.
Если надумаете, то значения следует выбрать такие (программа на эстонском): первый комбо бокс - первое,
второй - первое, третий - ничего, четвертый - первое и остальное оставить как есть. Тогда через какое-то время должен появиться график.
Спасибо.

еще хотел спросить, если я запускаю программу так сказать "на полную катушку", то выскакивает ошибка OutOfSpace как я понял мне надо скомпелировать её со значением -Xmx256m или java -Xmx512m, но я работаю с eclipse, есть ли там возможность один раз ввести это значение, чтобы больше не надо было вводить? И где, вообще, там нужно вводить параметры для компилирования?
17K
26 ноября 2006 года
Victa
16 / / 07.06.2006
Во первых, вы добавляете drawPanel к mainPanel без JScrollPane.
Во вторых все таки вместо Canvas лучше использовать JPanel и paintComponent вместо paint. ОСтавьте мейл или асю, я перешлю вам исправленный код.

Аргументы в Эклипсе можно установить так - на тулбаре кнопка Run->Run... вкладка Arguments.

Но, как мне кажется, скорее всего нужно менять что то в архитектуре.

Кроме того, хорошо бы придерживаться код конвеншен, довольно тяжело разбирать код с переменными типа combo1,combo2. Константы желательно вынести в отдельный класс, бизнес-логику и ГУИ разделить.
10K
26 ноября 2006 года
ljevik
48 / / 02.10.2006
Эмаил : [email]alexander.gavrilov06@rambler.ru[/email]

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

Огромное спасибо за советы, постараюсь их учесть. Просто яву изучаю вот только с начала осени, а раньше С был, немогу к классам привыкнуть.:(

А на счет имен? Какие они должны быть? Я вроде во многих программках что-то подобное встречал.

Еще раз спасибо за отзывчивость.
17K
26 ноября 2006 года
Victa
16 / / 07.06.2006
Смотрите почту. Там глючок произошел - 2 раза один и тот же файл приложился :-(((
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог