【问题标题】:Can I have JPanels with different sizes in JTabbedPane tabs?我可以在 JTabbedPane 选项卡中使用不同大小的 JPanel 吗?
【发布时间】:2019-09-23 06:02:13
【问题描述】:

我希望 JPanels 添加到具有不同大小的 JTabbedPane 中。我希望 JTabbedPane 具有固定大小(插入到其中的 JFrame)并且在选项卡内部以显示 JPanel,每个 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);
            }
        });
    }
}

有谁知道如何获得这种效果?我发现了几篇关于在调整内容大小时调整整个窗口大小的帖子,但我希望窗口保持一个大小并仅调整内容大小。

我可以设置标签的布局吗?即使我为插入 JTabbedPane 的 JFrame 设置布局,选项卡内部似乎也有自己的布局。我希望元素位于左上角。我可以改变它吗?

【问题讨论】:

    标签: java swing tabs jpanel jtabbedpane


    【解决方案1】:

    。因此,如果 JPanel 小于选项卡的大小,则选项卡的其余部分将是 JFrame 的颜色

    不确定这是一个很棒的 LAF。选项卡式窗格具有边框。即使您只显示较小的面板,您仍然会看到选项卡式窗格的边框是最大选项卡的大小。

    我可以设置标签的布局吗?

    选项卡式窗格有自己的布局管理器,这就是所有子选项卡大小相同的原因。

    但是,您可以简单地将“子”面板添加到您添加到选项卡的面板中。然后你可以使用任何你想要放置子面板的布局管理器。

    使用这种方法,您将设置子面板的背景,并且选项卡将显示为框架的相同背景,但当然您仍会看到选项卡式窗格边框。

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

    不要在 Swing 组件中使用 setSize(...)。那没有任何作用。布局管理器的工作是设置组件的大小/位置,因此您指定的任何内容都会被更改。

    对于一个简单的“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);
                }
            });
        }
    }
    

    【讨论】:

    • 非常感谢,我在选项卡中添加了 JPanel,效果非常好!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多