Как изменить размер JPanel с помощью CardLayout

#java #css #swing #layout-manager #cardlayout

#java #css #качать #макет-менеджер #cardlayout

Вопрос:

Я просто хочу знать, есть ли способ изменить размер jpanels, который имеет CardLayout в качестве макета. У меня здесь есть картинка, на которой вы можете видеть, что у меня 5 панелей.

введите описание изображения здесь

Вот мои фрагменты кода:

     JPanel container = new JPanel();
JPanel panel_1 = new JPanel(); // red
JPanel panel_2 = new JPanel(); // violet
JPanel panel_3 = new JPanel(); // violet
JPanel panel_4 = new JPanel(); // blue
FlowLayout flow = new FlowLayout(FlowLayout.RIGHT,1,1);
CardLayout cl = new CardLayout();
  

Это для моей первой панели, которая является № 3 на картинке.

   panel_1 = new JPanel();
    panel_1.setBackground(Color.WHITE);
    panel_1.setBorder(new EmptyBorder(0, 0, 0, 0));
    panel_1.setLayout(flow);

    JButton btnGroup1 = new JButton("<html><p align=center>Group<br>01</p></html>");
    btnGroup1.setIcon(new ImageIcon("more_buttons\green.png"));
    btnGroup1.setBorderPainted(false);  
        btnGroup1.setFocusPainted(false);
        btnGroup1.setContentAreaFilled(false); 
        btnGroup1.setHorizontalTextPosition(JButton.CENTER);
    btnGroup1.setFont(new Font("Calibri", Font.BOLD, 18));
    btnGroup1.setPreferredSize(new Dimension(80, 80));
    panel_1.add(btnGroup1);
  

И это остальная часть моей панели.

  panel_2 = new JPanel();
    panel_2.setBackground(Color.BLUE);
    panel_2.setBorder(new EmptyBorder(0, 0, 0, 0));
    panel_2.setLayout(flow);

    JButton button_2 = new JButton("<html><p align=center> </p></html>");
    button_2.setIcon(new ImageIcon("more_buttons\lightblue.png"));
    button_2.setBorderPainted(false);  
        button_2.setFocusPainted(false);
        button_2.setContentAreaFilled(false); 
        button_2.setHorizontalTextPosition(JButton.CENTER);
    button_2.setFont(new Font("Calibri", Font.BOLD, 12));
    button_2.setPreferredSize(new Dimension(80, 80));
    button_2.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            cl.show(container, "4");
        }
    });

    panel_2.add(button_2);

    panel_3 = new JPanel();
    panel_3.setBackground(Color.WHITE);
    panel_3.setBorder(new EmptyBorder(0, 0, 0, 0));
    panel_3.setLayout(flow);        

    JButton button_no_7 = new JButton("7");
    button_no_7.setIcon(new ImageIcon("more_buttons\gray.png"));
    button_no_7.setBorderPainted(false);  
        button_no_7.setFocusPainted(false);
        button_no_7.setContentAreaFilled(false); 
        button_no_7.setHorizontalTextPosition(JButton.CENTER);
    button_no_7.setFont(new Font("Calibri", Font.BOLD, 30));
    button_no_7.setPreferredSize(new Dimension(80, 80));
    panel_3.add(button_no_7);


    add(container);
    container.add(panel_1, "1");
    container.add(panel_2, "2");
    container.add(panel_3, "3");
    container.add(panel_4, "4");
  

Что я пытаюсь сделать, так это сменить 4-ю панель на картинке выше на другую панель, поэтому я использовал CardLayout, но я получаю только 1, 2 и 3. Отображаются. Он занимает пространство 4 и 5 панелей. Вот почему я хочу спросить, могу ли я каким-либо образом изменить размер панели для 3, чтобы можно было видеть панели 4 и 5. Я знаю, что .setPreferredSize(новое измерение (355, 10)); не работает, поскольку он переопределяется диспетчером компоновки. Итак, есть ли кто-нибудь, кто может мне в этом помочь?

Ответ №1:

Смысл использования CardLayout заключается в том, что все панели занимают одинаковое пространство, и одновременно может отображаться только одна панель.

Если вы хотите, чтобы было видно несколько панелей, вам нужно использовать другой менеджер компоновки, который отображает несколько дочерних панелей на родительской панели.

Прочитайте раздел из руководства Swing по использованию менеджеров компоновки для получения дополнительной информации о менеджерах компоновки. Затем вы можете использовать вложенные панели для достижения желаемого макета.

Кроме того, ваш код не должен использовать setPreferredSize() . Задача менеджера компоновки — установить размер / расположение компонента.

Так что, может быть, вы начнете с главной панели, у которой есть BorderLayout. Затем вы добавляете panel1 на СЕВЕР и pan2l2 на ЗАПАД. Затем вы создаете другую панель, которую добавляете в ЦЕНТР. Затем вы устанавливаете соответствующий макет для этой панели и добавляете панели 3, 4 на панель. Это способ логического вложения панелей для получения желаемого макета.

Комментарии:

1. Ооо, я вижу, но если я использую другой менеджер компоновки, я не могу переключить 4-ю панель на другую панель. Или я должен просто использовать cardlayout для моей 4-й панели? Но если я использую это, это будет отображать только больший размер панели, и я хочу, чтобы моя 4-я панель была единственной переключающейся на всех панелях.

2. Or should I just use the cardlayout for my 4th panel? — да, вы используете CardLayout на панели, которая содержит две панели, которые вы хотите поменять местами. Размер этой панели будет определяться размером самой большой добавленной к ней панели. Вы не можете управлять размером самостоятельно.

3. Итак, вы говорите, что если я переключу 4-ю панель, вся панель 3,4,5 будет занята новой 4-й панелью? И это, как вы сказали You cannot manage the size yourself . Если я использую макет gridbag, это будет то же самое? Смогу ли я получить макет, который я хочу?

4. Вы видите, что в 3,4,5 у меня есть кнопки. На панели 4 я должен переключить панель 4 на другую панель с тем же размером, не беспокоя другие кнопки, потому что они должны быть неповрежденными, и мне нужны их значения для базы данных. Вот почему я хочу, чтобы переключалась только 4-я панель.

5. In panel 4 i have to switch panel 4 into another panel with same size — Panel4 — это CardLayout и содержит две отдельные панели, давайте назовем их panel4A и panel4B. Размер панели 4 равен размеру самой большой панели (4A или 4B). Сначала отображается 4A, а затем вы можете переключиться на 4B. Панель 4 не влияет на panel1, panel2, panel3 или panel5.

Ответ №2:

@camickr ясно сказал об этом. Я думаю, вы неправильно поняли, как использовать CardLayout .

Добавьте эту строку:

 panel_4.setLayout(new CardLayout());
  

и добавьте 2 панели, на которые вы хотите переключиться panel_4 . Допустим, они A и B .

 panel_4.add(A, "panelA");
panel_4.add(B, "panelB");
  

Чтобы отобразить их, добавьте кнопку для переключения.

 CardLayout cc = (CardLayout)(panel_4.getLayout());
cc.show(panel_4, "panelA");
  

Первым параметром этого метода является родительский контейнер, вторым — имя отображаемой панели.

В вашем коде я вижу, что вы хотите сделать container отображение panel_4 , но панель с CardLayout будет отображать панель во всем ее пространстве. Он не может отображать одну панель в левом верхнем углу, а остальная часть остается нетронутой. Все или ничего.

Итак, эта строка:

 container.add(panel_4, "4"); 
  

будет отображаться во всей его области panel_4.

Комментарии:

1. Спасибо за ваш ответ. Прошло 2 года с тех пор, как я спросил, все равно спасибо за объяснение! Теперь я это понимаю. 🙂

2. Я рад, что помог. Я тоже рад поделиться своими знаниями.