Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 1
Регистрация: 25.02.2015
Сообщений: 2

JScrollPane и позиционирование

25.02.2015, 18:59. Показов 1217. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Первый пост, уровень Java: чайник.
Пишу софтину, которая должна в окошке выдать список из 88-ми лейблов и 88-ми пар радиокнопок. Пока настраиваю позиционирование только на лейблах.
Возникла проблема.
Java
1
2
3
4
5
6
7
8
9
10
11
Container container = new Container();
        container = getContentPane();
        JPanel panel = new JPanel(new FlowLayout());
        container.add(panel);
 
        for (int i = 0; i < leongard.numberOfQuestions; i++)
        {
            q[i] = new JLabel();
            q[i].setText(leongard.questions[i]);
            panel.add(q[i]);
        }
Такой код даёт мне окно, в котором эти лейблы расположены в столбик и ведут себя довольно-таки нормально, по правилам FlowLayout - переносят слова, если не умещаются в окно, меняют конфигурацию при ресайзе и всё такое.

Однако, стоит мне добавить прокрутку - всё летит к чёрту. Вот код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Container container = new Container();
        container = getContentPane();
        JPanel panel = new JPanel(new FlowLayout());
        container.add(panel);
 
 
        JScrollPane scr = new JScrollPane(panel,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); //НОВАЯ СТРОЧКА В КОДЕ
        container.add(scr); //НОВАЯ СТРОЧКА В КОДЕ
 
 
        for (int i = 0; i < leongard.numberOfQuestions; i++)
        {
            q[i] = new JLabel();
            q[i].setText(leongard.questions[i]);
            panel.add(q[i]);
 
        }
При исполнении этого кода, появляется полоса прокрутки, но все лейблы расположены в строчку. Начало первого лейбла привязано к верхнему левому углу окна, двигается вместе с ним.
Я знаю, что я где-то что-то не сказал, но у меня самого варианты кончились. Я смотрел другие типы позиционирования, даже боксы, но везде не то. Подскажите, пожалуйста, как заставить это дело располагаться в столбик?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.02.2015, 18:59
Ответы с готовыми решениями:

Как на JScrollPane добавить несколько JScrollPane?
как на JScrollPane добавить несколько JScrollPane? Мне нужно на фрейме разместить пару JLabel, а под ними JTable. я так понимаю,...

JScrollPane
Мне нужно добавить нужную мне панель (MapPanel) на панель прокрутки, чтобы у MapPanel был фиксированный размер. Следующий код растягивает...

Jscrollpane
Есть таблица с 26 столбцами, горизонтальный скроллбар не показывает...

1
0 / 0 / 1
Регистрация: 25.02.2015
Сообщений: 2
01.03.2015, 01:56  [ТС]
Нашёл решение сам, спасибо, блин. -_-Для флоулэйаута басурманы предлагают модификацию FlowLayout'а.
Вот такую:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import java.awt.*;
 
/**
  * A modified version of FlowLayout that allows containers using this
  * Layout to behave in a reasonable manner when placed inside a
  * JScrollPane
  * @author Babu Kalakrishnan
  * Modifications by greearb and jzd
  */
 
 public class ModifiedFlowLayout extends FlowLayout {
       public ModifiedFlowLayout() {
              super();
           }
 
           public ModifiedFlowLayout(int align) {
              super(align);
           }
       public ModifiedFlowLayout(int align, int hgap, int vgap) {
          super(align, hgap, vgap);
       }
 
       public Dimension minimumLayoutSize(Container target) {
          // Size of largest component, so we can resize it in
          // either direction with something like a split-pane.
          return computeMinSize(target);
       }
 
       public Dimension preferredLayoutSize(Container target) {
          return computeSize(target);
       }
 
       private Dimension computeSize(Container target) {
          synchronized (target.getTreeLock()) {
             int hgap = getHgap();
             int vgap = getVgap();
             int w = target.getWidth();
 
             // Let this behave like a regular FlowLayout (single row)
             // if the container hasn't been assigned any size yet
             if (w == 0) {
                w = Integer.MAX_VALUE;
             }
 
             Insets insets = target.getInsets();
             if (insets == null){
                insets = new Insets(0, 0, 0, 0);
             }
             int reqdWidth = 0;
 
             int maxwidth = w - (insets.left + insets.right + hgap * 2);
             int n = target.getComponentCount();
             int x = 0;
             int y = insets.top + vgap; // FlowLayout starts by adding vgap, so do that here too.
             int rowHeight = 0;
 
             for (int i = 0; i < n; i++) {
                Component c = target.getComponent(i);
                if (c.isVisible()) {
                   Dimension d = c.getPreferredSize();
                   if ((x == 0) || ((x + d.width) <= maxwidth)) {
                      // fits in current row.
                      if (x > 0) {
                         x += hgap;
                      }
                      x += d.width;
                      rowHeight = Math.max(rowHeight, d.height);
                   }
                   else {
                      // Start of new row
                      x = d.width;
                      y += vgap + rowHeight;
                      rowHeight = d.height;
                   }
                   reqdWidth = Math.max(reqdWidth, x);
                }
             }
             y += rowHeight;
             y += insets.bottom;
             return new Dimension(reqdWidth+insets.left+insets.right, y);
          }
       }
 
       private Dimension computeMinSize(Container target) {
          synchronized (target.getTreeLock()) {
             int minx = Integer.MAX_VALUE;
             int miny = Integer.MIN_VALUE;
             boolean found_one = false;
             int n = target.getComponentCount();
 
             for (int i = 0; i < n; i++) {
                Component c = target.getComponent(i);
                if (c.isVisible()) {
                   found_one = true;
                   Dimension d = c.getPreferredSize();
                   minx = Math.min(minx, d.width);
                   miny = Math.min(miny, d.height);
                }
             }
             if (found_one) {
                return new Dimension(minx, miny);
             }
             return new Dimension(0, 0);
          }
       }
 
    }
Однако, меня устроило решение с другой разметкой:
Java
1
2
3
4
5
GridLayout gl = new GridLayout(0,1);
        JPanel panel = new JPanel(gl);
        container.add(panel);
        JScrollPane scr = new JScrollPane(panel,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        container.add(scr);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.03.2015, 01:56
Помогаю со студенческими работами здесь

JScrollPane and ArrayList
Подскажите пожалуйста как вывести все элементы ArrayList в JScrollPane?? сделал так:for (int i=0; i&lt;nums.size();i++){ ...

Прокрутка JScrollPane
привет. подскажите, как сделать, чтобы при добавлении нового элемента внутрь панели вертикал скролл сам проматывался вниз?

Не отображается JScrollPane
Не отображается скроллбар. Если заставить отображаться насильно, то он отображается, но нет возможности прокрутить. Хотя текст явно имеется...

Проблемы с JScrollPane
Задача следующая , записывать информацию в JTextArea в цикле, информация должна вписываться не заменяя старую Вписывать не заменяя...

Не могу победить JScrollPane
И так, все что нужно: добавить JPanel на JScrollPane, А JScrollPane в свою очередь на JFrame, и этого ни как сделать не получается,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru