0

原始顶部标签方向设置:

http://dl.dropbox.com/u/3238736/screenshots/Screenshot-PasswordStore-1.png

有问题的右标签方向设置:

在此处输入图像描述

从上面的 GUI 中,我的 JTabbedPane(右侧的蓝色选项卡)与“退出”按钮(使用 GlassPane 呈现)重叠。

注意:退出按钮使用 GlassPane 呈现在右上角。

我想要一些关于移动蓝色标签为“退出”按钮留出一些间距的技术建议?

创建 GlassPane 以插入 Quit 按钮的代码如下所示:

public void addUniversalQuitBtn() {
    // Thanks to http://www.java-forums.org/awt-swing/12267-how-add-jbutton-tabbed-pane-headder.html forum post regarding adding a button on glasspane.
    Rectangle tabBounds = mainTabPane.getBoundsAt(0);
    Container glassPane = (Container) this.getRootPane().getGlassPane();
    glassPane.setVisible(true);
    glassPane.setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.weightx = 1.0;
    gbc.weighty = 1.0;
    gbc.fill = GridBagConstraints.NONE;
    gbc.insets = new Insets(tabBounds.y, 0, 0, 10);
    gbc.anchor = GridBagConstraints.NORTHEAST;
    quitBtn.setPreferredSize(new Dimension(quitBtn.getPreferredSize().width, (int) tabBounds.getHeight() - 2));
    glassPane.add(quitBtn, gbc);

}

谢谢。

4

2 回答 2

1

好吧,我建议您将退出按钮从 glasspane 移动到某个适当的容器,但是使用标准的 Swing JTabbedPane 你不能那样说......

所以这里有一些解决方案:

public static void main ( String[] args )
{
    JFrame frame = new JFrame ();

    Insets current = UIManager.getInsets ( "TabbedPane.tabAreaInsets" );
    UIManager.put ( "TabbedPane.tabAreaInsets",
            new Insets ( current.top, 40, current.bottom, current.right ) );

    JTabbedPane tabbedPane = new JTabbedPane ();
    tabbedPane.setTabPlacement ( JTabbedPane.RIGHT );
    tabbedPane.addTab ( "Tab 1", new JLabel () );
    tabbedPane.addTab ( "Tab 2", new JLabel () );
    frame.add ( tabbedPane );

    UIManager.put ( "TabbedPane.tabAreaInsets", current );

    JTabbedPane tabbedPane2 = new JTabbedPane ();
    tabbedPane2.setTabPlacement ( JTabbedPane.RIGHT );
    tabbedPane2.addTab ( "Tab 3", new JLabel () );
    tabbedPane2.addTab ( "Tab 4", new JLabel () );
    frame.add ( tabbedPane2, BorderLayout.SOUTH );

    frame.setSize ( 400, 400 );
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}

第一个选项卡式窗格(顶部)在顶部和选项卡之间有 30px 的间隙。第二个选项卡式窗格设置了默认间隙。

通过更改“TabbedPane.tabAreaInsets”键下的插图,您可以操纵选项卡运行和选项卡式窗格侧之间的间距。请注意,当标签位置与 TOP 不同时,这些插图会旋转。因此,如果您想使用 RIGHT 标签位置修改顶部间距,您应该修改左侧而不是顶部,就像我在示例中所做的那样。

并且不要忘记将旧的 Insets 值放回去,否则该更改将影响更改后创建的所有选项卡式窗格。

我也不能保证这适用于所有本机 UI,但我认为应该支持这些基本功能。至少它在 Windows、Mac OS 和 Metal LaFs 中受支持。

还有一件事-您将无法在运行时为已创建的选项卡式窗格更改选项卡区域插入,因为它在创建时保存到特定的系统 UI 中并且无法更新该值(至少不使用反射“功能”并暴力访问私有字段)。因此,如果您只希望在一种选项卡放置中出现该间隙,则必须重新创建选项卡式窗格。

于 2012-04-19T12:16:32.987 回答
0

好的。对我来说听起来有点奇怪......但你可以有 2 个按钮:一个在 GlassPane 中(如果 TabbedPane 朝上则可见)和一个在顶部的 Bar 中(如果 TabbedPane 朝右则可见)

于 2012-04-19T05:30:47.733 回答