1

Тема: Прошу допомоги з JScrollPane

Не можу помістити JPanel з елементами в JScrollPane. Не прокручується, і взагалі чомусь розташовується з боку. Підкажіть де помилка?

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyFrame extends JFrame{


    private JButton a = new JButton("my a button");
    private JButton b = new JButton("button");
    private JButton c = new JButton("button br");
    private JPanel panel1 = new JPanel();
    private JPanel panel2 = new JPanel();
    private JLabel label = new JLabel(
            "<html>Once upon <br>a time,<br>" +
            "a mouse, <br>" +
            "a bird, <br>" +
            "and <br>a sausage, <br>" +
            "entered <br>into <br>" +
            "partnership <br>and <br>" +
            "set up house <br>together. <br>" +
            "For a long <br>time all <br>" +
            "went <br>well; <br>" +
            "they lived <br>in great <br>comfort, <br>" +
            "and <br>prospered <br>so far <br>" +
            "as to be <br>able to <br>" +
            "add <br>considerably <br>" +
            "to their <br>stores.");

    public MyFrame(String str){

        super(str);

        setSize(600, 450);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setVisible(true);
        setLayout(new GridBagLayout());

        JScrollPane sp = new JScrollPane();
        sp.setViewportView(panel2);
        sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        add(sp);

        add(panel1, new GridBagConstraints(0, 0, 1, 1, 1, 1,
                GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
                new Insets(2, 2, 2, 2), 0, 0));
        add(panel2, new GridBagConstraints(0, 0, 1, 1, 1, 1,
                GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
                new Insets(2, 2, 2, 2), 0, 0));


        panel2.setLayout(new GridBagLayout());
        panel1.setLayout(new GridBagLayout());

        panel1.add(a);

        panel2.setVisible(false);
        

        panel2.add(label, new GridBagConstraints(0, 0, 1, 1, 1, 1,
                GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
                new Insets(2,2,2,2),0,0));

        panel2.add(b, new GridBagConstraints(0, 1, 1, 1, 1, 1,
                GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
                new Insets(2, 2, 2, 2), 0, 0));

        panel2.add(c, new GridBagConstraints(0, 2, 1, 1, 1, 1,
                GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
                new Insets(2,2, 2, 2), 0, 0));


        a.setCursor(new Cursor(Cursor.HAND_CURSOR));
        a.addActionListener(new AButtonActList());

        b.setCursor(new Cursor(Cursor.HAND_CURSOR));
        b.addActionListener(new BButtonActList());
        b.setPreferredSize(c.getPreferredSize());
        b.setMinimumSize(b.getPreferredSize());

    }

    private void createUIComponents() {

    }

    public class AButtonActList  implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent event) {

            panel1.setVisible(false);
            panel2.setVisible(true);

        }
    }
    public class BButtonActList implements ActionListener {


        @Override
        public void actionPerformed(ActionEvent event) {

            panel1.setVisible(true);
            panel2.setVisible(false);

        }
    }
}

2 Востаннє редагувалося fed_lviv (09.09.2015 12:38:51)

Re: Прошу допомоги з JScrollPane

Igor_Mar написав:

Не можу помістити JPanel з елементами в JScrollPane. Не прокручується, і взагалі чомусь розташовується з боку. Підкажіть де помилка?

Не знаю, що у Вас з боку, але пробував запустити Ваш код, там взагалі "все з боку". Але дивлячись по коду, Ви чомусь компоненти JPanel безпосередньо ліпити  у фрейм:

add(panel2, new GridBagConstraints(0, 0, 1, 1, 1, 1,
                GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
                new Insets(2, 2, 2, 2), 0, 0));

Робіть, щось на зразок:

...
JPanel panel=new JPanel();
JScrollPane scrl=new JScrollPanel(panel);
add(scrl);
...

3

Re: Прошу допомоги з JScrollPane

Так з:

add(panel2, new GridBagConstraints(0, 0, 1, 1, 1, 1,
                GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
                new Insets(2, 2, 2, 2), 0, 0));

я прогнав, дякую. Але коли виправив JScrollPanel виглядає як маленьке віконце по центру. Як зробити його на весь фрейм?

4

Re: Прошу допомоги з JScrollPane

Ну, це компоновка. Я так розумію, Ви тільки почали знайомство з SWINGом, навіщо Вам відразу GridBagLayout. Я наприклад не розумію, як Ви хочете розмістити компоненти на фреймі. Ось почиайте про компоновку:
https://docs.oracle.com/javase/tutorial … isual.html

5

Re: Прошу допомоги з JScrollPane

Я читав вже подібні статті про менеджери компоновки. Тому зупинився на GridBagLayout. Мій код має стати колись програмою "тестом на темперамент" (наприклад). Мені протрібно буде близько 150 елементів які мають бути на одній сторінці і просто прокручуватись (як якась велика сторінка на якомусь сайті). І вся ця сторінка має естетично виглядати при зміні розміру фрейма. Я сам не зміг знайти відповідей за допомогою гугла, тому звернувся на форум. Прошу допомоги

6

Re: Прошу допомоги з JScrollPane

має виглядяти приблизно так:
http://stanislaw.ru/rus/research/psytests/temper/

7

Re: Прошу допомоги з JScrollPane

Чесно, все рівно не розумію. Максимум, що можу уявити це JScrollPane(JPanel) на весь фрейм. А вже у самому JPanel розміщувати решту копонентів.

...
// setLayout(new BorderLayout());
JPanel panel=new JPanel();
JScrollPane scrl = new JScrollPane(panel);
add(scrl, BorderLayout.CENTER);
...

Ви не хочете намалювати, наприклад в Paint малюночок і кинути його сюди?

8

Re: Прошу допомоги з JScrollPane

Ну ось наприклад, кожен елемент обвів рамкою, що б було видно, скільки місця займає компонент:

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JLabel;
import javax.swing.BorderFactory;
import javax.swing.SwingUtilities;

public class MyFrame extends JFrame {

    private JLabel label = new JLabel("I am label");
    private JPanel panel = new JPanel();
    private JScrollPane scroll = new JScrollPane(panel,
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    
    public static void main(String[] arr) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MyFrame("Test");
            }
        });
    }

    public MyFrame(String str) {
        super(str);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        panel.add(label);
        panel.setBorder(BorderFactory.createLineBorder(Color.GREEN));
        scroll.setBorder(BorderFactory.createLineBorder(Color.RED));
        add(scroll);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
}

9

Re: Прошу допомоги з JScrollPane

Тип темперамента по кругу Айзенка

Ответьте на 57 вопросов либо «да», либо «нет».

Часто ли Вы испытываете тягу к новым впечатлениям, к тому, чтобы встряхнуться, испытать возбуждение?
Да
Нет
Часто ли Вы чувствуете, что нуждаетесь в друзьях, которые вас понимают, могут одобрить или утешить?
Да
Нет
Считаете ли Вы себя безобидным человеком?
Да
Нет
Очень ли трудно Вам отказаться от своих намерений?
Да
Нет
Вы обдумываете свои дела не спеша, предпочитаете подождать, прежде чем действовать?
Да
Нет
Всегда ли Вы сдерживаете свои обещания, не считаясь с тем, что Вам это невыгодно?
Да
Нет
Часто ли у Вас бывают спады и подъёмы настроения?
Да
Нет
Вообще, Вы действуете и говорите быстро, не задерживаясь для обдумывания?
Да
Нет
Возникало ли у Вас чувство, что Вы несчастный человек, хотя серьёзной причины для этого не было?
Да
Нет
Верно ли, что Вы почти на всё могли бы решиться, если дело пошло на спор?
Да
Нет
Вы смущаетесь, когда хотите завязать разговор с незнакомым человеком?
Да
Нет
Бывает ли, что разозлившись, Вы выходите из себя?
Да
Нет
Часто ли бывает, что Вы действуете под влиянием минуты?
Да
Нет
Часто ли Вас терзают мысли о том, что чего-либо не следовало делать или говорить?
Да
Нет
Предпочитаете ли Вы книги встречам с другими людьми?
Да
Нет
Верно ли, что Вас довольно легко задеть?
Да
Нет
Вы любите часто бывать в компании?
Да
Нет
Бывают ли у Вас мысли, о которых неудобно рассказывать другим?
Да
Нет
Верно ли, что Вы иногда полны энергии так, что всё горит в руках, а иногда вялые?
Да
Нет
Предпочитаете ли иметь поменьше приятелей, но зато особенно близких?
Да
Нет
Вы много мечтаете?
Да
Нет
Когда на Вас кричат, отвечаете тем же?
Да
Нет
Часто ли Вас терзает чувство вины?
Да
Нет
Все ли ваши привычки хороши и желательны?
Да
Нет
Способны ли Вы дать волю чувствам и вовсю повеселиться в шумной компании?
Да
Нет
Можно ли сказать, что нервы бывают у Вас часто натянуты до предела?
Да
Нет
Вы слывёте за человека весёлого и живого?
Да
Нет
После того как дело сделано, часто ли Вы мысленно возвращаетесь к нему, думая, что могли бы сделать лучше?
Да
Нет
Вы обычно чувствуете себя спокойным, когда находитесь в компании?
Да
Нет
Бывает ли, что Вы передаёте слухи?
Да
Нет
Бывает ли, что Вам не спится из-за того, что разные мысли лезут Вам в голову?
Да
Нет
Если хотите узнать о чём-нибудь, то предпочитаете прочитать в книге, чем спросить у друзей?
Да
Нет
Бывает ли у Вас сильное сердцебиение?
Да
Нет
Нравится ли Вам работа, требующая пристального внимания?
Да
Нет
Бывают ли у Вас приступы дрожи?
Да
Нет
Если бы Вы знали, что никогда сказанное Вами не будет раскрыто, всегда бы высказывались в духе общепринятого?
Да
Нет
Вам неприятно бывать в компании, где подшучивают друг над другом?
Да
Нет
Вы раздражительны?
Да
Нет
Вам нравится работа, которая требует быстроты действия?
Да
Нет
Верно ли, что Вам нередко не дают покоя мысли о разных неприятностях и ужасах, которые могли бы произойти, хотя всё закончилось благополучно?
Да
Нет
Вы медлительны и неторопливы в движениях?
Да
Нет
Вы когда-нибудь опаздывали на свидания или на работу?
Да
Нет
Часто ли вам снятся кошмары?
Да
Нет
Вы любите поговорить настолько, что никогда не упустите удобный случай с незнакомым человеком?
Да
Нет
Беспокоят ли вас какие-либо боли?
Да
Нет
Вы чувствовали бы себя несчастным, если долго не смогли бы видеться со своими знакомыми, друзьями?
Да
Нет
Можете ли Вы назвать себя нервным человеком?
Да
Нет
Среди людей, которых Вы знаете, есть ли такие, которые Вам явно не нравятся?
Да
Нет
Можете ли Вы сказать, что Вы уверенный в себе человек?
Да
Нет
Обидитесь ли Вы, если покритиковать недостатки Ваши и Вашей работы?
Да
Нет
Вы считаете, что трудно получить настоящее удовольствие от вечеринки?
Да
Нет
Беспокоит ли Вас чувство, что Вы чем-то хуже других?
Да
Нет
Вам трудно внести оживление в скучную компанию?
Да
Нет
Круг темпераментов Айзенка
Бывает ли, что Вы говорите о вещах, в которых совсем не разбираетесь?
Да
Нет
Вы беспокоитесь о своём здоровье?
Да
Нет
Вы любите подшучивать над другими?
Да
Нет
Страдаете ли Вы от бессонницы?
Да
Нет

Це те, що я хочу мати на основній сторінці.
Як це можливо виконати в одному фреймі, де сам тест має з"явитись після натискання кнопки старт?
Який лейаут порадите?

10

Re: Прошу допомоги з JScrollPane

Який лейаут використовують коли треба в стровпчик помістити дуже багато елементів, які не повинні змінювати своє місцезнахоження після зміни розміру фрейма?

11 Востаннє редагувалося fed_lviv (10.09.2015 13:25:02)

Re: Прошу допомоги з JScrollPane

А, Ви веселий! Чому тільки 57 запитань, давайте не менше сотні!

Igor_Mar написав:

Це те, що я хочу мати на основній сторінці.
Як це можливо виконати в одному фреймі, де сам тест має з"явитись після натискання кнопки старт?
Який лейаут порадите?

В принципі чим Вам погано підходить варіант, який я написав вище? А нарахунок "з'являння" це вже, як Вам до вподоби. Можна кнопку додати в самий низ фрейма, можна спочатку діалогове вікно, а потім тест, можна...

12

Re: Прошу допомоги з JScrollPane

Дякую. Запитань 57 тому, що так придумав Айзенк. Ви праві... краще зробити спочатку діалогове вікно, а потім вже тест, а в третьму буде виводитись результат.
А взагалі, можливий такий варіант? Один фрейм, в першій панелі всього одна кнопка (Старт) при натисканні на неї відбувається перехід на сам тест вже в панелі №2 зі скролпейном, а панель №1 зникає. Тобто 1 фрейм, дві панелі зі скролпейн в другій парелі.
Буду радий отримати відповідь.

13

Re: Прошу допомоги з JScrollPane

Igor_Mar написав:

Дякую. Запитань 57 тому, що так придумав Айзенк.


:) Ні, ну я розумію, що не Ви, але навіщо їх всіх викидати у повідомленні!?

Igor_Mar написав:

А взагалі, можливий такий варіант? Один фрейм, в першій панелі всього одна кнопка (Старт) при натисканні на неї відбувається перехід на сам тест вже в панелі №2 зі скролпейном, а панель №1 зникає. Тобто 1 фрейм, дві панелі зі скролпейн в другій парелі.
Буду радий отримати відповідь.

Звичайно, можна, все можна. На те Ви і вчите мову програмування, щоб створювати те, що Вам потрібно.

14

Re: Прошу допомоги з JScrollPane

:) Дякую. Все ясно, буду рити далі.