Java 将组件放置在JTabbedPane中选项卡的右侧

Java 将组件放置在JTabbedPane中选项卡的右侧,java,swing,Java,Swing,好的,我正在尝试修改下面链接中的现有答案,以满足我的需要。在我的例子中,我需要设置JTabbedPane.TOP,但是按钮消失了 我对Swing不太熟悉,请有人告诉我。下面是link的完整工作代码示例 公共类右选项卡面板按钮面板{ 公共静态void main(字符串[]args){ SwingUtilities.invokeLater(新的Runnable(){ @凌驾 公开募捐{ 新的RightTabPaneButtonPanel().makeUI(); } }); } public voi

好的,我正在尝试修改下面链接中的现有答案,以满足我的需要。在我的例子中,我需要设置JTabbedPane.TOP,但是按钮消失了

我对Swing不太熟悉,请有人告诉我。下面是link的完整工作代码示例

公共类右选项卡面板按钮面板{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
新的RightTabPaneButtonPanel().makeUI();
}
});
}
public void makeUI(){
JTabbedPane tabbedPane=新的JTabbedPane();
tabbedPane.setTabPlacement(JTabbedPane.TOP);
JPanel面板=新JPanel(新网格布局(1,0));
对于(int i=0;i<3;i++){
JPanel tab=新的JPanel();
tab.setName(“tab”+(i+1));
tab.setPreferredSize(新尺寸(400400));
tabbedPane.add(选项卡);
JButton按钮=新JButton(“B”+(i+1));
设置边距(新的插图(0,0,0,0));
面板。添加(按钮);
}
JFrame=新JFrame();
frame.add(选项卡窗格);
frame.pack();
矩形tabBounds=tabbedPane.getBoundsAt(0);
容器玻璃窗格=(容器)frame.getGlassPane();
玻璃窗格。设置为可见(真);
setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.weightx=1.0;
gbc.weighty=1.0;
gbc.fill=GridBagConstraints.NONE;
int margin=tabbedPane.getWidth()-(tabBounds.x+tabBounds.width);
gbc.插图=新插图(0,0,0,边距);
gbc.anchor=GridBagConstraints.Southwest;
panel.setPreferredSize(新尺寸((int)tabBounds.getWidth()-margin,
panel.getPreferredSize().height));
玻璃材质窗格玻璃。添加(面板,gbc);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
}

我想这就是你想要的:

GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.NORTHEAST;
panel.setPreferredSize(new Dimension(panel.getPreferredSize().width,
            (int) tabBounds.getHeight()));
glassPane.add(panel, gbc);

下面是一种使用
overlylayout
的方法:

import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.*;

public class TabbedPaneWithComponent
{
    private static void createAndShowUI()
    {
        JPanel panel = new JPanel();
        panel.setLayout( new OverlayLayout(panel) );

        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.add("1", new JTextField("one"));
        tabbedPane.add("2", new JTextField("two"));
        tabbedPane.setAlignmentX(1.0f);
        tabbedPane.setAlignmentY(0.0f);

        JCheckBox checkBox = new JCheckBox("Check Me");
        checkBox.setOpaque( false );
        checkBox.setAlignmentX(1.0f);
        checkBox.setAlignmentY(0.0f);

        JPanel right = new JPanel( new FlowLayout(FlowLayout.RIGHT, 5, 0) );
        right.setOpaque( false );
        right.setAlignmentX(1.0f);
        right.setAlignmentY(0.0f);
        right.add( new JCheckBox("Check Me") );
        right.add( new JCheckBox("Or Check Me") );
        right.setMaximumSize( right.getPreferredSize() );


        panel.add( checkBox );
//      panel.add( right );
        panel.add(tabbedPane);

        JFrame frame = new JFrame("TabbedPane With Component");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( panel );
        frame.setLocationByPlatform( true );
        frame.setSize(400, 100);
        frame.setVisible( true );
        System.out.println(checkBox.getPreferredSize() + " : " + right.getPreferredSize());
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

尝试打印出传递给
面板的维度对象。设置PreferredSize
。按钮面板要放在哪里?东北?是的东北。把按钮对齐就行了。这很好,谢谢。我不知道你可以用你。我想OverlyLayout比getGlassPane解决方案更受欢迎?GlassPane会影响整个GUI。如果将GlassPane用于此功能,则不能将其用于其他任何功能。玻璃窗格通常用于临时处理。请参见使用临时禁用框架的Swing教程示例。OverlayLayout只影响面板及其子组件,因此我建议这是一个更好的解决方案。
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.*;

public class TabbedPaneWithComponent
{
    private static void createAndShowUI()
    {
        JPanel panel = new JPanel();
        panel.setLayout( new OverlayLayout(panel) );

        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.add("1", new JTextField("one"));
        tabbedPane.add("2", new JTextField("two"));
        tabbedPane.setAlignmentX(1.0f);
        tabbedPane.setAlignmentY(0.0f);

        JCheckBox checkBox = new JCheckBox("Check Me");
        checkBox.setOpaque( false );
        checkBox.setAlignmentX(1.0f);
        checkBox.setAlignmentY(0.0f);

        JPanel right = new JPanel( new FlowLayout(FlowLayout.RIGHT, 5, 0) );
        right.setOpaque( false );
        right.setAlignmentX(1.0f);
        right.setAlignmentY(0.0f);
        right.add( new JCheckBox("Check Me") );
        right.add( new JCheckBox("Or Check Me") );
        right.setMaximumSize( right.getPreferredSize() );


        panel.add( checkBox );
//      panel.add( right );
        panel.add(tabbedPane);

        JFrame frame = new JFrame("TabbedPane With Component");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( panel );
        frame.setLocationByPlatform( true );
        frame.setSize(400, 100);
        frame.setVisible( true );
        System.out.println(checkBox.getPreferredSize() + " : " + right.getPreferredSize());
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}