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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу изменять размеры элементов 
:(
    Опции темы
celeir
Дата 28.4.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте.
Вот самый примитивный код - фрейм с тремя панелями, хочу поставить в верхней панели кнопку указанных размеров. 
setSize игнорируется, setBounds игнорируется, если убрать у панели Layout по-умолчанию, кнопка вообще не отображается на панели. 

Код

import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainClass {
    
    public static void main(String[] args) {
        JFrame mainFr=new JFrame();
        mainFr.setSize(200, 200);
        mainFr.setVisible(true);
        
        JPanel firstP=new JPanel();
        JPanel secondP=new JPanel();
        JPanel thirdP=new JPanel();
        mainFr.add(firstP,BorderLayout.NORTH);
        mainFr.add(secondP,BorderLayout.CENTER);
        mainFr.add(thirdP,BorderLayout.SOUTH);
        
        firstP.setBorder(BorderFactory.createLineBorder (Color.orange, 1));
        secondP.setBorder(BorderFactory.createLineBorder (Color.blue, 1));
        thirdP.setBorder(BorderFactory.createLineBorder (Color.red, 1));
        
        //firstP.setLayout(null);
        JButton bt=new JButton();
        firstP.add(bt);
        //bt.setBounds(10, 10, 100, 40);
        bt.setSize(100, 40);        
    }
}


Я в замешательстве. Это же не какие-то продвинутые операции, это самые основы основ. Почему они не работают?

К слову, если поставить среднюю панель вот такой:
Код

class ImagePanel extends JPanel{
    private Image image;
    
    public ImagePanel(JFrame fr){
     setBorder(BorderFactory.createLineBorder (Color.orange, 1));
     try {
         image = ImageIO.read(new File("здесь полный путь"));
     }catch (IOException e) {} 
    }

   public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 20, 40, null); 
   }   
}


то окно будет с каждым запуском отображаться по-разному. Это как-то связано с перерисовкой или что?

И ещё вопрос вдогонку - где должна лежать картинка и как к ней обратиться вместо "здесь полный путь", чтоб её нашло автоматом? Сохранял в папку src проекта, обращался File("/pic.gif") - не видит.

Заранее спасибо за уделённое время.
PM MAIL   Вверх
jk1
Дата 28.4.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Я в замешательстве. Это же не какие-то продвинутые операции, это самые основы основ. Почему они не работают?

Как раз поэтому и не работают. Абсолютное позиционирования числами применяется в самых крайних случаях, потому что дизайн ваших форм должен прилично выглядеть на любом экране при любом размере окна. В пределах разумного. Поэтому применяется схема, основанная на LayoutManager'ах. Она обеспекчивает растягивание или сужение нужных компонент при изменении размеров окна. Для получения требуемого поведения необходимо подобрать нужный менеджер для каждого контенера и (опционально) сконфигурировать его под ваши нужды. О том, как это сделать. 

Разумеется, всегда можно отказаться от использования менеджеров, мало ли какие обстоятельства возникают. В этом отношении вы все сделали правильно, кроме одного: если контейнер остается без менеджера, то вам придется руками определять его размер:
Код

 firstP.setPreferredSize(new Dimension(100,100));


Теперь о методах установки размеров:
setSize() имеет невысокий приоритет и может помочь в случае отсутствия менеджера. В общем случае можно дать рекомендацию компоненту придерживаться по возможности заданного размера методом setPreferredSize(). Также можно задавать минимальный и максимальный размеры, но соблюдены они будут только если менеджер сочтет это возможным.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
celeir
Дата 28.4.2010, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



setPreferredSize() помог, спасибо большое. Выходит, использование этого метода тоже откладывается на крайний случай?
А если так:
-читаем размеры окна
-вычитаем из них какое-то число по осям
-результат передаём в setPreferredSize каждому элементу или элементу, который должен быть больше остальных того же типа (одна кнопка длиннее других),

то это можно назвать глупой затеей или заслуживающей права на жизнь?


Попробовал ещё setMinimumSize и setMaximumSize, как не растягивал/сжимал окно, кнопка в размерах не изменилась. Когда их в таком случае использовать?


О, сейчас столкнулся ещё с одним моментом - если кнопка одна, её не хочет прижимать к краю через BorderLayout.West
Сто-то я не помню, чтоб BorderLayout просто центрировал всё без вариантов. Или всё же проглядел?

Это сообщение отредактировал(а) celeir - 28.4.2010, 13:40
PM MAIL   Вверх
jk1
Дата 28.4.2010, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

то это можно назвать глупой затеей или заслуживающей права на жизнь?

Мне доводилось делать сложные формы со вкладками и раздвижными панелями, где число компонентов переваливало за сотню. И для всего этого писать обработчики ресайза окна и калькуляторы размеров? Я бы сразу застрелился от такой перспективы. А с Layout Manager'ами выходило аккуратно и без лишних усилий со стороны разработчиков.
Цитата

если кнопка одна, её не хочет прижимать к краю через BorderLayout.West

он для этого не предназначен. С одним компонентом лучше использовать FlowLayout, у него кстати есть параметр, определяющий, по какому краю выравнивать.
Цитата

Попробовал ещё setMinimumSize и setMaximumSize, 

обычно в этом нет необходимости, так как компоненты сами неплохо справляются с определением границ своих размеров. Эти значения носят рекомендательный характер: если менеджер сочтет возможным их выполнить, он их выполнит. Единственный случай, где мне приходилось их применять постоянно - при задании ширины столбцов в таблицах.


--------------------
Opinions are like assholes — everybody has one
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.0427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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