首页 > 解决方案 > JTabbedPane 如何拥有多行选项卡,而每个选项卡面板底部没有额外的间距/填充?

问题描述

JTabbedPane的后续行动,为什么只有当我有多个选项卡时才会有额外的填充?(代码和图片)

我有很多标签,所以我希望有多行标签以避免过度滚动。这使得 SCROLL_TAB_LAYOUT 不受欢迎,因为它创建了单行选项卡(如左图所示)。

使用 WRAP_TAB_LAYOUT 可以让我拥有多行选项卡。但是,我在每个选项卡面板的底部都有额外的空间(由右图中的大红色区域显示)。

左边的面板只有 1 行,右边的面板有额外的填充

有没有办法获得多行制表符,而没有 WRAP_TAB_LAYOUT 丑陋的额外空格?

下面是一些创建 JTabbedPane 的代码。对于大量选项卡(20+),两种布局都不令人满意。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class DialogTest {

    public static void main(String[] args) {
        new DialogTest();
    }

    public DialogTest() {
        JDialog dialog = new MyDialog();
        dialog.pack();
        dialog.setVisible(true);
    }

    class MyDialog extends JDialog {

        public MyDialog() {
            super(null, ModalityType.APPLICATION_MODAL);

            final JTabbedPane tabs = new JTabbedPane();
            tabs.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); // change to WRAP_TAB_LAYOUT for other layout
            final int numTabs = Integer.parseInt(JOptionPane.showInputDialog("Number of tabs:"));

            setPreferredSize(new Dimension(400, 200));

            for (int i = 1; i <= numTabs; i++) {
                tabs.addTab("Tab"+i, new MyPanel(i));
            }

            setLayout(new BorderLayout());
            add(tabs, BorderLayout.NORTH);
        }
    }

    class MyPanel extends JPanel {
        public MyPanel(int text) {
            final JLabel label = new JLabel("THIS IS A PANEL" + text);
            label.setFont(label.getFont().deriveFont(18f));
            label.setBackground(Color.cyan);
            label.setOpaque(true);

            add(label);
            setBackground(Color.red);
        }   
    }
}

标签: javaswingjpaneljtabbedpane

解决方案


通过设置大小,JDialog您可以定义一个需要由添加到其中的组件填充的区域。
看来你需要由 的内容来定义区域JDialog,所以首先想到的就是去掉setPreferredSize(new Dimension(400, 200));,让布局管理器定义合适的大小。

接下来,您需要MyPanel使用其布局管理器将内容 ( ) 设置为所需的大小和布局。以下 MREGridBagLayout用于此目的:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class DialogTest {

    public static void main(String[] args) {
        new DialogTest();
    }

    public DialogTest() {
        JDialog dialog = new MyDialog();
        dialog.pack();
        dialog.setVisible(true);
    }

    class MyDialog extends JDialog {

        public MyDialog() {

            super(null, ModalityType.APPLICATION_MODAL);
            final JTabbedPane tabs = new JTabbedPane();
            //tabs.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
            tabs.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);

            for (int i = 1; i <= 12; i++) {  //12 as an arbitrary test value
                tabs.addTab("Tab"+i, new MyPanel(i));
            }

            setLayout(new BorderLayout());
            add(tabs, BorderLayout.NORTH);
        }
    }

    class MyPanel extends JPanel {

        public MyPanel(int text) {

            final JLabel label = new JLabel("THIS IS A PANEL" + text);
            label.setFont(label.getFont().deriveFont(18f));
            label.setBackground(Color.cyan);
            label.setOpaque(true);

            setBackground(Color.RED);
            GridBagLayout gridBagLayout = new GridBagLayout();
            gridBagLayout.columnWidths = new int[]{400, 0}; //affects parent width 
            gridBagLayout.rowHeights = new int[]{100, 0};   //affects parent height
            gridBagLayout.columnWeights = new double[]{0.0, Double.MIN_VALUE};
            gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE};
            setLayout(gridBagLayout);

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.anchor = GridBagConstraints.NORTH;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.gridx = 0;
            gbc.gridy = 0;

            add(label, gbc);
        }
    }
}

在此处输入图像描述


推荐阅读