【问题标题】:Can I have a JTabbedPane with a JMenuBar?我可以有一个带有 JMenuBar 的 JTabbedPane 吗?
【发布时间】:2012-03-15 23:23:26
【问题描述】:

我正在尝试增加标签内容的可用空间量。

如何在选项卡列表旁边放置一个菜单栏或等效项? (最好在选项卡的左侧,图片的对面)

【问题讨论】:

    标签: java swing


    【解决方案1】:

    您可以使用 jide 的 JideTabbedPane。

    Jide 是商业库,但是这个 JideTabbedPane 类是开源的,在这里获取源代码:http://java.net/projects/jide-oss/

    截图如下。

    【讨论】:

      【解决方案2】:

      不,不覆盖整个 BacisTabbedPaneUI 直接不可能,所有示例都是各种质量(外观和原生操作系统非常敏感),very good example by aephyr

      我的观点 JTabbedPane 是 *** JComponent,实现 GlassPane 的有趣示例(您为 JMenuBar 设置了一些边框,例如凸起的蚀刻和线条边框??? :-)

      疯狂而肮脏的黑客攻击

      来自代码

      import java.awt.ComponentOrientation;
      import java.awt.Container;
      import java.awt.Dimension;
      import java.awt.GridBagConstraints;
      import java.awt.GridBagLayout;
      import java.awt.Insets;
      import java.awt.Rectangle;
      import javax.swing.Box;
      import javax.swing.JFrame;
      import javax.swing.JMenu;
      import javax.swing.JMenuBar;
      import javax.swing.JPanel;
      import javax.swing.JTabbedPane;
      import javax.swing.SwingUtilities;
      
      public class TabbedPaneWithManuBar {
      
          public void makeUI() {
              JTabbedPane tabbedPane = new JTabbedPane();
              tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
              for (int i = 0; i < 20; i++) {
                  JPanel panel = new JPanel();
                  panel.setName("tab" + (i + 1));
                  panel.setPreferredSize(new Dimension(600, 100));
                  tabbedPane.add(panel);
              }
              JFrame frame = new JFrame();
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.add(tabbedPane);
              frame.pack();
              Rectangle tabBounds = tabbedPane.getBoundsAt(0);
              Container glassPane = (Container) frame.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 + 23, 0, 0, 5);
              gbc.anchor = GridBagConstraints.NORTHEAST;
              JMenuBar menuBar = new JMenuBar();
              menuBar.add(createMenu("Menu Example 1"));
              menuBar.add(createMenu("Menu Example 1"));
              menuBar.add(createMenu("Menu Example 1"));
              menuBar.add(Box.createHorizontalGlue());
              menuBar.add(createMenu("About"));
              menuBar.setPreferredSize(new Dimension(menuBar.getPreferredSize().width , (int) tabBounds.getHeight() - 2));
              glassPane.add(menuBar, gbc);
              //JButton button = new JButton("My Button Position");
              //button.setPreferredSize(new Dimension(button.getPreferredSize().width, (int) tabBounds.getHeight() - 2));
              //glassPane.add(button, gbc);
              frame.setLocationRelativeTo(null);
              frame.setVisible(true);
          }
      
          private JMenu createMenu(String title) {
              JMenu m = new JMenu(title);
              m.add("Menu item #1 in " + title);
              m.add("Menu item #2 in " + title);
              m.add("Menu item #3 in " + title);
              if (title.equals("About")) {
                  m.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
              }
              return m;
          }
      
          public static void main(String[] args) {
              SwingUtilities.invokeLater(new Runnable() {
      
                  @Override
                  public void run() {
                      new TabbedPaneWithManuBar().makeUI();
                  }
              });
          }
      }
      

      【讨论】:

      • @Ofek Ron 1. 为 Glasspane 使用适当的 LayoutManager,2. 然后(例如)您可以从 ContentPane 中覆盖所有需要的 Rectangle,(查看我的 JTabbedPane 和放置在 GlassPane 中的浮动 JMenu) 3. 放入GLassPane 一些 JComponent(JPanel 或带有背景或图标的不透明 JLabel),它们支持透明或半透明(更好) 4. RootPane 的代码错误,(jPanel.add(jRootPane); - 为什么要创建新的 ContentPane) 5. 不运行你的代码,不是删除帖子的原因
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多