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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JPanel вставить налету в JScrollPane, Как сделать? Подробности внутри. 
:(
    Опции темы
Real McCoy
Дата 17.1.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте все!

Помогите, плз, разобраться в следующем: я пишу класс, который расширяет JPanel.
Код

public class MyClass extends JPanel
{
  // ...
}

Т.е. именно таким должен представляться объект его контейнеру. К коду контейнера я никакого доступа не имею. У контейнера область, в которую будет вставляться моя панель, может быть разного размера, поэтому есть идея вставлять свою панель в JScrollPane. Но вот вопрос: можно ли сделать это в моём коде, и так, чтобы контейнер попрежнему видел мой объект как JPanel? Буду весьма признателен за пример smile
PM MAIL   Вверх
batigoal
Дата 17.1.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 7
Всего: 151



Я не очень уловил смысл вопроса. Контейнер по-любому сможет добавить в себя компонент, унаследованный от awt.Component, т.е. и JPanel, и JScrollPane. Ну а если в качестве контейнера выступает какой-то самописный компонент, которому нужен именно JPanel для добавления, то можно сделать так: наследовать MyClass от JPanel, в него вставлять JScrollPane, а в него - ещё один JPanel.



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Real McCoy
Дата 17.1.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(batigoal @  17.1.2008,  13:38 Найти цитируемый пост)
Я не очень уловил смысл вопроса.

Всё правильно уловил.

Спасибо!

Я про второй вариант думал, хотя он мне и не очень нравится.

А он будет так работать, как я описал? Т.е. внешняя панель будет автоматом ресайзиться до размера области, куда контейнер кладёт мой объект, а внутреннюю панель уже будет прокручивать JScrollPane, так?  Впрочем, я сейчас попробую, чем пассивно ждать ответа smile
PM MAIL   Вверх
Real McCoy
Дата 17.1.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Попробовал. Сделал именно так, как предлагали, и как мне не нравилось: мой класс - JPanel включает в себя JScrollPane, на которой лежит панель с контролами. Всё работает smile
PM MAIL   Вверх
batigoal
Дата 17.1.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 7
Всего: 151



Цитата(Real McCoy @  17.1.2008,  14:48 Найти цитируемый пост)
Т.е. внешняя панель будет автоматом ресайзиться до размера области, куда контейнер кладёт мой объект

Это зависит от layout'а контейнера. Для контейнера по умолчанию и для BorderLayout'а - да.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Real McCoy
  Дата 7.2.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Проблема неожиданно получила развитие :(

Сделал пример по принципу, описанному выше. Получил фрейм с моей панелью, но без вертикального скроллбара. Если же поставить принудительно 

scrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

то скроллбар появляется, но нижняя его стрелка находится где-то за пределами окна. Почему так? в чём я не прав?

Вот код примера:

Код

import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.border.BevelBorder;

public class ZTest extends javax.swing.JPanel
{
  final static String PANEL_NAME = "Test Panel"; 

  public ZTest()
  {
    initComponents();
  }

  private void initComponents()
  {
    javax.swing.JPanel pnlControls = new javax.swing.JPanel();
    
    this.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));

    GridBagLayout layout = new GridBagLayout();
    pnlControls.setLayout(layout);
    GridBagConstraints constraints = new GridBagConstraints();

    JLabel label = new JLabel(this.PANEL_NAME, javax.swing.SwingConstants.CENTER);
    label.setFont(new Font("Dialog", Font.BOLD, 18));
    constraints.gridwidth = 1;
    constraints.gridx = 0;
    constraints.gridy = 0;
    constraints.weightx = 1.0;
    constraints.weighty = 0.0;
    constraints.anchor = GridBagConstraints.CENTER;
    constraints.fill = GridBagConstraints.BOTH;
    constraints.insets = new java.awt.Insets(8, 0, 8, 0);
    layout.setConstraints(label, constraints);
    pnlControls.add(label);

    for(int i = 0; i < 10; i++)
    {
      constraints.gridy = i + 1;
      JLabel lbl = new JLabel("Label #" + i);
      layout.setConstraints(lbl, constraints);
      pnlControls.add(lbl);
    }

    JScrollPane scrollPane = new JScrollPane(pnlControls);
    scrollPane.setHorizontalScrollBarPolicy(
            javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    scrollPane.setVerticalScrollBarPolicy(
            javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);

    this.setLayout(new java.awt.BorderLayout());
    this.add("North", scrollPane);
  }

  
  public static void main(String[] args)
  {
    javax.swing.JFrame frame = new javax.swing.JFrame();
    ZTest panel = new ZTest();
    frame.getContentPane().add(panel);
    frame.pack();

    frame.setVisible(true);
    frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    frame.setSize(320, 160);
    frame.setResizable(false);
    frame.setTitle("ZTest");
    frame.setLocationRelativeTo(null);
  }
}


Это сообщение отредактировал(а) Real McCoy - 9.2.2008, 19:58
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.0457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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