JTabbedPane最小尺寸错误计算

时间:2013-04-01 14:54:24

标签: java swing size jtabbedpane preferredsize

我在java中发现了一个错误,我想知道解决它的最佳方法是什么。

当您创建具有左对齐的JTabbedPane(左侧的选项卡)并且如果您在选项卡中添加图标,则组件的最小大小不正确。

这是一种重现的简单方法:

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

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;

public class MinSizeComponent {


    // +--------------------------------
    // | constructor
    // +--------------------------------

    // +--------------------------------
    // | methods
    // +--------------------------------
    public void createAndShowGUI() {
        System.out.println("createAndShowGUI()");
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("Selection");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // +-----------------------------------------+
        // |               Gathering                 |
        // +-----------------------------------------+

        JPanel panel1 = new JPanel();
        panel1.setMinimumSize(new Dimension(100, 99));
        panel1.setPreferredSize(new Dimension(150, 99));

        JPanel panel2 = new JPanel();
        panel2.setMinimumSize(new Dimension(200, 99));
        panel2.setPreferredSize(new Dimension(250, 99));

        JPanel panel3 = new JPanel();
        panel3.setMinimumSize(new Dimension(50, 99));
        panel3.setPreferredSize(new Dimension(250, 99));

        JPanel panel4 = new JPanel();
        panel4.setMinimumSize(new Dimension(150, 99));
        panel4.setPreferredSize(new Dimension(250, 99));


        //WITH TOP ARRANGEMENT THERE IS NO PROBLEM
        //JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);

        //WITH LEFT ARRANGEMENT THE BUG APPEARS
        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.LEFT);

        //WITHOUT ADDING ICON IN THE TABS, THE MIN SIZE OF THE PANEL IS CORRECT: 200
        /*
        tabbedPane.addTab("PANEL 1", null, panel1, "tip1");
        tabbedPane.addTab("PANEL 2", null, panel2, "tip2");
        tabbedPane.addTab("PANEL 3", null, panel3, "tip3");
        tabbedPane.addTab("PANEL 4", null, panel4, "tip4");
        */

        //WITH ICONS IN THE TABS, THE MIN SIZE OF THE PANEL IS INCORRECT: ~285
        //SHOULD BE 200 AS WELL!
        tabbedPane.addTab("PANEL 1", new ImageIcon("Y:/src/resources/icons/IconUser_32x32.png"), panel1, "tip1");
        tabbedPane.addTab("PANEL 2", new ImageIcon("Y:/src/resources/icons/IconUser_32x32.png"), panel2, "tip2");
        tabbedPane.addTab("PANEL 3", new ImageIcon("Y:/src/resources/icons/IconUser_32x32.png"), panel3, "tip3");
        tabbedPane.addTab("PANEL 4", new ImageIcon("Y:/src/resources/icons/IconUser_32x32.png"), panel4, "tip4");

        JPanel rightPanel = new JPanel();
        rightPanel.add(new JLabel("label right panel"));

        JSplitPane splitPaneHorizontal = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tabbedPane, rightPanel);

        JPanel core = new JPanel(new BorderLayout());
        core.add(splitPaneHorizontal, BorderLayout.CENTER);
        core.setPreferredSize(new Dimension(500, 500));

        //Display the window.
        frame.getContentPane().add(core);
        frame.pack();
        frame.setVisible(true);
    }

    // +-----------------------------
    // | MAIN
    // +-----------------------------

    public static void main(String[] args) {
        MinSizeComponent toto = new MinSizeComponent();
        toto.createAndShowGUI();
    }
}

只需执行,最多移动左侧的拆分窗格。您可以看到JTabbedPane内容的大小约为285像素。 删除选项卡中的图标:大小变得正确:200像素(这是内部组件最小尺寸的最大值)。

任何人都知道解决问题的最佳方法是什么? 非常感谢,

0 个答案:

没有答案