Могу ли я иметь JPanels с разными размерами на вкладках JTabbedPane? - PullRequest
1 голос
/ 05 мая 2019

Я хочу, чтобы JPanels добавили в JTabbedPane, который бы имел разные размеры. Я хочу, чтобы JTabbedPane имел фиксированный размер (JFrame, в который он вставлен), а внутри вкладок отображается JPanels, который будет иметь индивидуальный размер для каждого JPanel. Поэтому, если размер JPanel меньше размера вкладки, оставшаяся часть вкладки будет иметь цвет JFrame (и, если он больше, будет отображаться JScrollPane). Как мне этого добиться?

Вот простой код:

package sample;

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

public class Main {

    private static JFrame frame;

    Main() {
        frame = new JFrame();

        JTabbedPane jTabbedPane = new JTabbedPane();

        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        JPanel panel3 = new JPanel();

        panel1.setSize(new Dimension(400, 400));
        panel2.setSize(new Dimension(500, 600));
        panel3.setSize(new Dimension(100, 100));

        panel1.setBackground(Color.WHITE);
        panel2.setBackground(Color.RED);
        panel3.setBackground(Color.GREEN);

        panel1.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
        panel2.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
        panel3.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));

        jTabbedPane.addTab("Tab1", panel1);
        jTabbedPane.addTab("Tab2", panel2);
        jTabbedPane.addTab("Tab3", panel3);

        frame.getContentPane().add(jTabbedPane, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setLocationRelativeTo(null);
    }


    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Main main = new Main();
                frame.setVisible(true);
            }
        });
    }
}

Кто-нибудь знает, как получить этот эффект? Я нашел несколько сообщений об изменении размера всего окна при изменении размера содержимого, но я хочу, чтобы окно оставалось одного размера и изменяло размер только содержимого.

Можно ли настроить макет для вкладок? Даже если я настроил макет для JFrame, в который вставлен JTabbedPane, вкладки, похоже, имеют свой собственный макет внутри. Я хочу, чтобы элементы были в левом верхнем углу. Могу ли я как-то это изменить?

1 Ответ

2 голосов
/ 05 мая 2019

.Поэтому, если размер JPanel меньше размера вкладки, остальная часть вкладки будет иметь цвет JFrame

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

Можно ли настроить макет для вкладок?

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

Однако вы можете просто добавить «дочернюю» панель на панель, которую добавляете на вкладку.Затем вы используете любой менеджер компоновки, который хотите расположить дочернюю панель.

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

panel1.setSize(new Dimension(400, 400));

Не используйте setSize (...) в компонентах Swing.Это ничего не делает.Задачей менеджера макета является установка размера / расположения компонента, поэтому все, что вы укажете, будет изменено.

Для простого примера "MCVE" вы можете использовать setPreferredSize(...), но общее правилопозволяет каждому компоненту определять свой собственный предпочтительный размер.

Реализуя приведенные выше предложения, вы получите следующее:

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

public class Main2 {

    private static JFrame frame;

    Main2() {
        frame = new JFrame();

        JTabbedPane jTabbedPane = new JTabbedPane();
        jTabbedPane.setBorder(null);

        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        JPanel panel3 = new JPanel();

        panel1.setLayout( new FlowLayout() );
        JPanel child = new JPanel();
        child.setPreferredSize( new Dimension(100, 100) );
        child.setBackground( Color.WHITE );
        panel1.add( child );

        panel1.setPreferredSize(new Dimension(400, 400));
        panel2.setPreferredSize(new Dimension(500, 600));
        panel3.setPreferredSize(new Dimension(100, 100));

        //panel1.setBackground(Color.WHITE);
        panel2.setBackground(Color.RED);
        panel3.setBackground(Color.GREEN);

        panel1.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
        panel2.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
        panel3.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));

        jTabbedPane.addTab("Tab1", panel1);
        jTabbedPane.addTab("Tab2", panel2);
        jTabbedPane.addTab("Tab3", panel3);

        frame.setLayout( new FlowLayout() );
        frame.add(jTabbedPane);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 700);
        frame.setLocationRelativeTo(null);
    }


    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Main2 main = new Main2();
                frame.setVisible(true);
            }
        });
    }
}
...