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

Расположить кнопки вертикально слева от PicturePanel

09.05.2014, 21:25. Показов 5385. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Фрагмент кода:
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
JPanel backgroundPanel = new JPanel(){ 
//В своём классе StartFrame создал панель, которая будет грузить
// изображение и отрисовывать его фоном
            @Override
            public void paintComponent(Graphics g)
            {
                Image img;
                try{
                    img = ImageIO.read(new File("background.jpg"));
                    g.drawImage(img, 0, 0, this);
                    StartFrame.this.setIconImage(img);
                }
                catch(java.io.IOException e){
                    this.setBackground(Color.BLUE);
                }
 
            }
        };
        
        button1 = new JButton("New Game");//Создал 4 кнопки
        button2 = new JButton("Continue");
        button3 = new JButton("Training");
        button4 = new JButton("Exit");
 
        Dimension d = new Dimension(100, 40); //Задал их размер
        button1.setPreferredSize(d);
        button2.setPreferredSize(d);
        button3.setPreferredSize(d);
        button4.setPreferredSize(d);
 
        frameSize = new Dimension(550,500); //Большая панелька
        picturePanel = new JPanel(){
            @Override
            public void paint(Graphics g){
                ....
                ....
            };
      picturePanel.setPreferredSize(frameSize); //задал её размер
      
      backgroundPanel.add(button1); //Добавил всё на основную панель
      backgroundPanel.add(button2);
      backgroundPanel.add(button3);
      backgroundPanel.add(button4);
      backgroundPanel.add(picturePanel);
      
      add(backgroundPanel); //смотрим что получилось
Получил следующее:



Теперь я хочу, расположить кнопки вертикально слева от PicturePanel. Для этого добавляю ещё один экземпляр класса JPanel
Java
1
2
3
4
5
6
7
8
9
      JPanel backgroundPanel2 = new JPanel();
        backgroundPanel2.setLayout(new BoxLayout(backgroundPanel2, BoxLayout.Y_AXIS));
        backgroundPanel2.add(button1);
        backgroundPanel2.add(button2);
        backgroundPanel2.add(button3);
        backgroundPanel2.add(button4);
 
        backgroundPanel.add(backgroundPanel2);
        backgroundPanel.add(picturePanel);


Внимание вопрос, как сделать так, чтобы кнопки были одинакового размера и не было лишнего фона, закрывающего картинку
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.05.2014, 21:25
Ответы с готовыми решениями:

Расположить вертикально блоки
Добрый день ув. пользователи ! Подскажите пожалуйста, если есть допустим книга, автор, описание. Как сделать блок, что бы данные в одном...

Возможно ли расположить SpinBox вертикально?
Возможно ли перевернуть SpinBox вертикально?

Как расположить картинки вертикально ?
Привет всем. Есть сайт (не реклама) Как сделать что бы картинки располагались в ряд ? Горизонтально , а не вертикально.

9
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
09.05.2014, 22:53
Ortaz, попробуйте использовать для
Java
1
backgroundPanel2.setLayout(new GridLayout(4,1));
Я могу ошибиться (смутно припоминаю что где то читал), но попробуйте вместо JPanel создать объект класса JComponent по моему там прозрачный фон. Проверить у меня сейчас нет возможности
1
3 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 47
10.05.2014, 20:55  [ТС]
Цитата Сообщение от reisal78 Посмотреть сообщение
Я могу ошибиться (смутно припоминаю что где то читал), но попробуйте вместо JPanel создать объект класса JComponent по моему там прозрачный фон. Проверить у меня сейчас нет возможности
JComponent - абстрактный класс, нельзя инициализировать.

А с GridLayout действительно помогло, спасибо большое. Единственный момент, что между левым краем и кнопками достаточно большое пространство, как их можно к левому краю подтянуть?

Java
1
2
3
4
MenuPanel.setLayout(new GridLayout(4, 1, 10, 0));
//или
MenuPanel.setLayout(new GridLayout(4, 2, 10, 0)); //при заполненных 4 кнопках
//не помогает
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
10.05.2014, 21:38
Ortaz, скрин покажите, не совсем понял что сделать надо
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
10.05.2014, 21:43
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
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.io.IOException;
 
/**
 * Created by Игорь on 10.05.2014.
 */
public class TestJpanel extends JFrame {
 
 
    public TestJpanel() throws HeadlessException {
        setTitle("TestJPanel");
        setLocationByPlatform(true);
        setSize(640, 480);
        setContentPane(new contentPanel());
        JPanel panel = new JPanel(new GridLayout(4, 1, 10, 10));
        panel.setOpaque(false);
        add(panel);
        panel.add(new JButton("test 1"));
        panel.add(new JButton("test 2"));
        panel.add(new JButton("test 3"));
        panel.add(new JButton("test 4"));
 
    }
 
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                TestJpanel frame = new TestJpanel();
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
 
    }
}
 
class contentPanel extends JPanel{
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        Image image = null;
        try {
            //moto.jpg в тот же пакет, где лежит класс
            image = ImageIO.read(getClass().getResource("moto.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        g2.drawImage(image, 0,0, this);
    }
}
Миниатюры
Расположить кнопки вертикально слева от PicturePanel  
0
3 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 47
10.05.2014, 22:07  [ТС]


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
public class StartFrame extends JFrame {
    JButton button1;
    JButton button2;
    JButton button3;
    JButton button4;
    
    public StartFrame()
    {
        Dimension WindowSize = new Dimension(800, 630); 
        setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));  
        setSize(WindowSize); 
        setResizable(false);
        BackgroundPanel = new JPanel(){
            @Override
            public void paintComponent(Graphics g)
            {
                Image img;
                try{
                    img = ImageIO.read(new File("background.jpg"));
                    g.drawImage(img, 0, 0, this);
                    StartFrame.this.setIconImage(img);
                    drawConnectionStatus(g);
                    drawAttentionStatus(g);
                }
                catch(java.io.IOException e){
                    this.setBackground(Color.BLUE);
                }
            }
        };
 
        JPanel MenuPanel = new JPanel();
        initMenuPanel(MenuPanel);
 
        frameSize = new Dimension(550,550);
        PicturePanel = new JPanel(){
            @Override
            public void paint(Graphics g)
            {
                   //...
            }
        };
        PicturePanel.setPreferredSize(frameSize); //задали размер
 
        initPicturePanel(PicturePanel);
 
        BackgroundPanel.add(MenuPanel);
        BackgroundPanel.add(PicturePanel);
        add(BackgroundPanel);
    }
 
public void initMenuPanel(JPanel MenuPanel)
    {
        button1 = new JButton("Новая игра");
        button2 = new JButton("Пауза");
        button3 = new JButton("Обучение");
        button4 = new JButton("Выход");
 
        Dimension d = new Dimension(100, 40);
        button1.setPreferredSize(d);
        button2.setPreferredSize(d);
        button3.setPreferredSize(d);
        button4.setPreferredSize(d);
        
        button2.setEnabled(false);
 
        MenuPanel.setLayout(new GridLayout(4, 1, 0, 0));
        MenuPanel.add(button1);
        MenuPanel.add(button2);
        MenuPanel.add(button3);
        MenuPanel.add(button4);
    }
  //....
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
10.05.2014, 22:29
Я не вижу где вы задаете менеджер компоновки для BackgroundPanel, следовательно там по умолчанию задался FlowLayout. Это кстати на мой взгляд не совсем правильно, в данном случае вам просто повезло что компоненты встали почти так, как вам нужно (возможно если будет установлено другое разрешение монитора, то компоненты "поплывут"... а может и нет ) я бы установил для BackgroundPanel

Java
1
BackgroundPanel.setLayout(new BorderLayout());
а панели добавлял бы

Java
1
BackgroundPanel.add(MenuPanel, BorderLayout.WEST);
Java
1
BackgroundPanel.add(PicturePanel, BorderLayout.CENTER);
и тд...
почитайте в сети о "менеджерах компоновки" там в первых же ссылках хорошие статьи вываливаются.
0
3 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 47
10.05.2014, 22:54  [ТС]
Я бы не сказал, что это лучше..



А при нажатии кнопки "Новая игра" в первую секунду происходит следующее



Через секунду возвращается к первоначальному варианту. Если скачок расширения может и вызван чем-то в моём коде, то кусок какой-то кнопки снизу..

Про Layout Manager я начал читать вчера, но с ходу разобраться не смог, а времени почти нет(
За завтра нужно уже документацию писать =D
В будущем обязательно разберусь)
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
10.05.2014, 23:17
ну у вас два варианта, либо поразбираться с менеджерами, либо
Java
1
BackgroundPanel.setLayout(null);
и для каждого компонента добавленного в эту панель указывать координаты и размеры
1
3 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 47
10.05.2014, 23:38  [ТС]


Лучший вариант, спасибо))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.05.2014, 23:38
Помогаю со студенческими работами здесь

Как расположить Jlabel вертикально?
Мне надо чтобы Jlabel был сверху вниз а не справа налево то есть вертикально .Пытался сделать setVerticalAlignment никакого...

Bootstrap 4. Расположить элементы вертикально
Добрый день! Ребят, как сделать средствами Bootstrap 4 задумку. Есть блок, равен высоте экрана, в нем 3 блока, первый блок должен быть...

Расположить фигуры вертикально в ряд
Доброго времени суток! Подскажите, пожалуйста, как можно сделать три вертикальных столбца из фигур (квадратов, как на изображении) на CSS?...

Как расположить вертикально два блока?
Как расположить эти два блока один под одним, чтобы надпись была у левого края? Как будто "Кпапочкою" .container { width:...

Расположить вертикально поля в табличной части
Можно ли расположить вертикально поля в табличной части? Если да, то как?


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru