java - JTabbedPane 如何拥有多行选项卡,而每个选项卡面板底部没有额外的间距/填充?
问题描述
JTabbedPane的后续行动,为什么只有当我有多个选项卡时才会有额外的填充?(代码和图片)
我有很多标签,所以我希望有多行标签以避免过度滚动。这使得 SCROLL_TAB_LAYOUT 不受欢迎,因为它创建了单行选项卡(如左图所示)。
使用 WRAP_TAB_LAYOUT 可以让我拥有多行选项卡。但是,我在每个选项卡面板的底部都有额外的空间(由右图中的大红色区域显示)。
有没有办法获得多行制表符,而没有 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);
}
}
}
解决方案
通过设置大小,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);
}
}
}
推荐阅读
- php - SQLSTATE [23000]:违反完整性约束:1048 列“post_id”不能为空
- javascript - 在循环中使用 Promise 会导致 Promise 失败
- html - CSS变换旋转问题
- visual-studio - 如何在 Visual Studio 2019 项目中恢复我的文件夹?
- php - 提供不同的抽象类在vendor中扩展
- javascript - React - 将 javascript 元素属性向下传递给子组件
- oauth - 实施从谷歌 Oauth 注销
- jquery - 带有分数的 Swiper 滑块进度条不起作用
- unit-testing - 使用项目反应器重试单元测试
- javascript - 我不知道如何将来自 document.write 的输入存储在变量中