JTabbedPane顶部和底部

时间:2018-07-14 21:55:22

标签: java swing desktop-application jtabbedpane

是否可以创建一个本质上具有JTabbedPane且在顶部和底部运行选项卡选项的UI?

我已经附上了一份模拟设计的照片,说明了我要做什么,并希望能对指导我实现此GUI提供任何帮助。

P.S。我正在使用NetBeans创建此桌面应用程序。

mock-design

1 个答案:

答案 0 :(得分:2)

我花了几个小时找到这个可行的解决方案。如果有一种方法可以将两个JTabbedPane放在彼此的顶部,将底部的选项卡窗格稍微移动一点,然后将其选项卡放在底部,那会很好。幸运的是,您可以使用JLayeredPane。您可以将组件彼此叠放,并使用setBounds(...)方法放置它们。完成此操作后,您需要确保 Multiple- JTabbedPane的行为符合预期。例如,当选择上方的选项卡式窗格时,它将在顶部,而下方的选项卡式窗格将没有任何选择,反之亦然。这是 MCVE

import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingConstants;

public class MultipleTabbedPane extends JFrame {

    public static final Dimension SIZE = new Dimension(300, 100);//size of tabbedpane
    private final JTabbedPane upper = new JTabbedPane();
    private final JTabbedPane lower = new JTabbedPane();
    private final JLayeredPane lp = new JLayeredPane();
    public static final int OFFSET = 21;//needed to shift the lower tabbedpane.

    public MultipleTabbedPane() {
        initComponents();
    }

    private void initComponents() {

        String tabName[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
        //String tabName[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
        //"11", "12", "13", "14", "15", "16", "17", "18", "19"};//more tabs!
        for (int i = 0; i < tabName.length; i++) {
            if (i % 2 == 0) {//even number
                createTabbedPane(upper, tabName[i], true);//upper holds even numbers
            } else {
                createTabbedPane(lower, tabName[i], false);//upper holds odd numbers
            }
        }

        lp.add(upper, 0, new Integer(1));
        lp.add(lower, 0, new Integer(2));
        getContentPane().add(lp);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Upper and Lower TabbedPane!");
        pack();
        setSize(new Dimension(400, 200));
        setVisible(true);
    }

    private void createTabbedPane(JTabbedPane tabbedPane, String s, boolean isUpper) {
        JLabel label = new JLabel("Tab " + s, SwingConstants.CENTER);
        tabbedPane.addTab("Tab " + s, null, label);
        tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
        tabbedPane.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if (isUpper) {//if upper 

                    if (upper.getSelectedIndex() == -1) {//upper not selected
                        //fixes a bug, select the lower tabbedpane and click near the 
                        //last tab (to the right) of the upper tabbedpane, you will 
                        //see that it will be unselected if the "return;" is not 
                        //added below.
                        return;
                    }
                    lower.setSelectedIndex(-1);//unselect the lower tabbedpane
                    lp.moveToFront(upper);//move it to the front
                } else {//if lower 
                    if (lower.getSelectedIndex() == -1) {
                        //same argument as above.
                        return;
                    }
                    upper.setSelectedIndex(-1);//unselect the upper tabbedpane
                    lp.moveToFront(lower);//move it to the front
                }
            }
        });

        if (isUpper) {//upper tabbedpane
            tabbedPane.setBounds(0, 0, SIZE.width, SIZE.height);
        } else {//lower tabbedpane
            tabbedPane.setSelectedIndex(-1);
            tabbedPane.setTabPlacement(JTabbedPane.BOTTOM);
            tabbedPane.setBounds(0, OFFSET, SIZE.width, SIZE.height);
        }
    }

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

The Result!

相关问题