是否可以创建一个本质上具有JTabbedPane且在顶部和底部运行选项卡选项的UI?
我已经附上了一份模拟设计的照片,说明了我要做什么,并希望能对指导我实现此GUI提供任何帮助。
P.S。我正在使用NetBeans创建此桌面应用程序。
答案 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();
}
}