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));
}
}
Создание JScrollPane
Код:
В классе ExtendedCanvas просто происходит рисование. Но там у меня график иногда выходит за пределы панели и я хочу, чтобы в этом случае появлялась ScrollPane, а она ни в этом, ни в каком другом не появляется. Может ли кто-нибудь помочь?? Буду признателен.
"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, скролбары бутут прорисованы.
Спасибо, а поначалу setPreferredSize используются какие величины? Начальные высота и ширина панели? И еще вопрос, вот у меня реализовано двумя отдельными классами это и если я затем в новом классе пересчитаю размер панели с графиком, то как мне вернуть это значение для scroll pane? Если у меня график рисуется после нажатия на кнопке, нужно ли мне в ActionListner прописывать что-то вроде scrollPane.revalidate()? Извините за столь наивные и глупые вопросы, но почему-то в том учебнике, что я читаю (Core Java 2 Edition) о полосе прокрутке наисана пара строк в случае, если она добавляется к JTeaxtArea, а те примеры, что на sun-овском сайте в tutorial мне не помогли.
Кстати, в строке drawPanel = new ExtendedCanvas() будет ошибка приведения типа. Или вы используете собственный класс Canvas?
Код:
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();
}
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, есть ли там возможность один раз ввести это значение, чтобы больше не надо было вводить? И где, вообще, там нужно вводить параметры для компилирования?
Во вторых все таки вместо Canvas лучше использовать JPanel и paintComponent вместо paint. ОСтавьте мейл или асю, я перешлю вам исправленный код.
Аргументы в Эклипсе можно установить так - на тулбаре кнопка Run->Run... вкладка Arguments.
Но, как мне кажется, скорее всего нужно менять что то в архитектуре.
Кроме того, хорошо бы придерживаться код конвеншен, довольно тяжело разбирать код с переменными типа combo1,combo2. Константы желательно вынести в отдельный класс, бизнес-логику и ГУИ разделить.
Я согласен, в архитекруте нужно менять многое, я думаю, вы поняли, что так программа коннектиться к сайту, и с этого сайта она ищет информацию (цену и площадь об участках), разбирая сайт, я нашел, что там есть возможность установить pagesize и тогда будет открыватся столько участков на одной странице, в зависимости чему равен сайз. Но тогда получается много кода надо тянуть со страницы, а я весь код помещаю в одну строковую переменную и боюсь, если я выставляю слишком большое число в этом сайзе или хочу открыть все участки (их там где-то 4500), то программа виснет, сейчас я немножко переделал
код и беру их серсусов только информацию об участках, а код страницы отбрасываю, но это мало что дало.
Огромное спасибо за советы, постараюсь их учесть. Просто яву изучаю вот только с начала осени, а раньше С был, немогу к классам привыкнуть.:(
А на счет имен? Какие они должны быть? Я вроде во многих программках что-то подобное встречал.
Еще раз спасибо за отзывчивость.
Смотрите почту. Там глючок произошел - 2 раза один и тот же файл приложился :-(((