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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Основное отличие JFrame от JPanel как контейнера 
:(
    Опции темы
Royan
Дата 25.7.2008, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


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

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



Правильно ли я понимаю, что основное отличие JFrame от JPanel как контейнера заключается в том что в JFrame можно добавить только один компонент

Пример:

Код

public class SimpleTest extends JFrame {
    private ConcurrentHashMap<String, Integer> map;

    public SimpleTest() {
        super("Test");
        GridBagLayout gridbag = new GridBagLayout();
        GridBagConstraints c = new GridBagConstraints();
        
        c.fill = GridBagConstraints.BOTH;
        c.weightx = 1.0;


        map = new ConcurrentHashMap<String, Integer>();
        JButton add = new JButton(new AbstractAction(){

            @Override
            public void actionPerformed(ActionEvent e) {
                map.put("test", new Random().nextInt());
            }
            
        });
        add.setText("Add");
        
        JButton print = new JButton(new AbstractAction(){

            @Override
            public void actionPerformed(ActionEvent e) {
                JFrame f = new JFrame("New frame");
                f.setSize(100, 100);
                f.setVisible(true);
            }
            
        });
        print.setText("Print");
        
        gridbag.setConstraints(add, c);
        
        JPanel panel = new JPanel();
        panel.setLayout(gridbag);
        
        
        add(add);
        gridbag.setConstraints(print, c);
        add(print);
        
//        add(panel);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SimpleTest();
            }
        });

    }
}


Если же я буду добавлять в панель но все OK будет две кнопки. Вопрос на самом деле такой - где об этом написано?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
dorogoyIV
Дата 25.7.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

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



Цитата(Royan @  25.7.2008,  12:08 Найти цитируемый пост)
Правильно ли я понимаю, что основное отличие JFrame от JPanel как контейнера заключается в том что в JFrame можно добавить только один компонент

я так не думаю. JFrame - это некая оболочка, в которой могут разместиться разные JPanel (также и другие компоненты).


Цитата(Royan @  25.7.2008,  12:08 Найти цитируемый пост)
Если же я буду добавлять в панель но все OK будет две кнопки

тут я не понял ??? какие две кнопки???

PM MAIL   Вверх
fixxer
Дата 25.7.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

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



Красавец! Компоненты добавляешь в JFrame, а LayoutManager кладешь в JPanel.
Замени
panel.setLayout(gridbag);
на 
this.setLayout(gridbag);
и будет тебе счастье.




--------------------
user posted image
PM MAIL ICQ   Вверх
dorogoyIV
Дата 25.7.2008, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

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



вот еще для наглядности список контейнеров на пустом JFrame
Код

import java.awt.*;
import javax.swing.*;

public class TestJFrame extends JFrame
{
 public static void main(String [] args)
 {
  JFrame f = new TestJFrame();

  Component [] comps = f.getComponents();
  for(int i = 0; i < comps.length; i++)
  {
   if(comps [i] instanceof Container)
    processContainer((Container)comps [i]);
  }
 }

 static void processContainer(Container c)
 {
  System.out.println(c);

  for(int i = 0; i < c.getComponents().length; i++)
  {
   if(c.getComponents()[i] instanceof Container)
    processContainer((Container)c.getComponents()[i]);
  }
 }
}

PM MAIL   Вверх
AntonSaburov
Дата 25.7.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Читайте доки иногда

JFrame contains a JRootPane as its only child. The content pane provided by the root pane should, as a rule, contain all the non-menu components displayed by the JFrame.

PM MAIL WWW ICQ   Вверх
fixxer
Дата 25.7.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

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



AntonSaburov, ты это к чему? 

Начиная с Java 5, JFrame#add(Component) эквивалентно JFrame#getContententPane().add(Component)

Код

protected void addImpl(Component comp, Object constraints, int index) {
        if(isRootPaneCheckingEnabled()) {
            getContentPane().add(comp, constraints, index);
        }
        else {
            super.addImpl(comp, constraints, index);
        }
    }





--------------------
user posted image
PM MAIL ICQ   Вверх
Royan
Дата 25.7.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


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

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



В общем все ясно в доках действительно все сказано: The default content pane will have a BorderLayout manager set on it. из-за которого меня и проглючило:

Фокус в действии
Код

package test;

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SimpleTest extends JFrame {
    public SimpleTest() {
        super("Test");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());     
        panel.add(new JButton("Add"));
        panel.add(new JButton("Print"));
           
        add(panel);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SimpleTest();
            }
        });
    }
}


Комментируем строчку panel.setLayout(new BorderLayout());  все становится на "круги своя" обе кнопки видны


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
dorogoyIV
Дата 25.7.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

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



Цитата(Royan @  25.7.2008,  15:32 Найти цитируемый пост)
Комментируем строчку panel.setLayout(new BorderLayout());  все становится на "круги своя" обе кнопки видны

 smile 
тогда читай про LayoutManager
можно было написать например так: panel.add(new JButton("Print"), "South"); не убирая BorderLayout
PM MAIL   Вверх
AntonSaburov
Дата 25.7.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Или вот - Layout Manager
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0786 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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