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

标签 java swing

好的,我正在尝试修改下面链接中的现有答案以满足我的需求。就我而言,我需要设置 JTabbedPane.TOP,但随后按钮就会消失。

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

How to place components beneath tabs in right oriented JTabbedPane

    public class RightTabPaneButtonPanel {

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {
        new RightTabPaneButtonPanel().makeUI();
      }
    });
  }



    public void makeUI() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.setTabPlacement(JTabbedPane.TOP);
        JPanel panel = new JPanel(new GridLayout(1, 0));

    for (int i = 0; i < 3; i++) {
      JPanel tab = new JPanel();
      tab.setName("tab" + (i + 1));
      tab.setPreferredSize(new Dimension(400, 400));
      tabbedPane.add(tab);

      JButton button = new JButton("B" + (i + 1));
      button.setMargin(new Insets(0, 0, 0, 0));
      panel.add(button);
    }

    JFrame frame = new JFrame();
    frame.add(tabbedPane);
    frame.pack();
    Rectangle tabBounds = tabbedPane.getBoundsAt(0);

    Container glassPane = (Container) frame.getGlassPane();
    glassPane.setVisible(true);
    glassPane.setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.weightx = 1.0;
    gbc.weighty = 1.0;
    gbc.fill = GridBagConstraints.NONE;
    int margin = tabbedPane.getWidth() - (tabBounds.x + tabBounds.width);
    gbc.insets = new Insets(0, 0, 0, margin);
    gbc.anchor = GridBagConstraints.SOUTHEAST;

    panel.setPreferredSize(new Dimension((int) tabBounds.getWidth() - margin,
            panel.getPreferredSize().height));
    glassPane.add(panel, gbc);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}

最佳答案

这是一种使用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();
            }
        });
    }
}

关于java - 将组件放置在 JTabbedPane 中选项卡的右侧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40021783/

相关文章:

java - 无法确定这些测试错误的原因,调试器无法在此处运行,我也无法找出解决方法

java - 将项目导入到 android studio 3.0.1 后任务 : 'app.transformClassesWithDesugarForDebug' . 执行失败

java - 将 JSON 字符串解析为 JSONArray (Android)

java - 文本中的常用词

java - 如何在 Java Swing 中对齐组件?

java - 添加java 2d组件后如何刷新JFrame

java - 如何在 url 中隐藏 index.jsp

Java图形结账模拟;

java - Swing 和 JavaFX : how to convert JavaFX MouseEvent to Swing MouseEvent?

java - 涉及Swing的EDT的线程错误