如何在Java Swing中将标签放在JInternalFrame标题栏上?

时间:2014-11-13 03:24:36

标签: java eclipse swing jtabbedpane jinternalframe

我希望有一个能够像Eclipse IDE一样处理JTabbedPane的JInternalFrame。我希望标签位于标题栏的顶部。每个选项卡都应有自己的关闭按钮。 InternalFrame还应该有一个关闭按钮,以便用户可以一次关闭所有选项卡。

这就是我所拥有的:

enter image description here

这就是我想要的(截图取自Eclipse IDE):

enter image description here

我不知道如何实现这一目标。有谁能指出我正确的方向?

修改

根据查看UI委托的注释,我创建了一个能够删除菜单的UI委托子类,但是存在一些问题:

  1. 与普通的JInternalFrame相比,它看起来很有趣,即使我没有做任何事情,但注释掉了“createActionMap”和“add(menuBar)”行。

    enter image description here

  2. 我找不到库代码中的任何位置来指示标题栏和contentPane位置的设置方式 - 显然我想移动contentPane的位置以重叠标题栏。

  3. 以下是代码:

    public class MyInternalFrameUI extends BasicInternalFrameUI {
    
        public MyInternalFrameUI(JInternalFrame b) {
            super(b);
            // TODO Auto-generated constructor stub
        }
    
        public static ComponentUI createUI(JComponent b)    {
            return new MyInternalFrameUI((JInternalFrame)b);
        }
    
        protected JComponent createNorthPane(JInternalFrame w) {
            titlePane = new MyBasicInternalFrameTitlePane(w);
            return titlePane;
          }
    }
    
    public class MyBasicInternalFrameTitlePane extends BasicInternalFrameTitlePane {
    
        public MyBasicInternalFrameTitlePane(JInternalFrame f) {
            super(f);
        }
    
        protected void installTitlePane() {
            installDefaults();
            installListeners();
    
            createActions();
            enableActions();
            //createActionMap(); // This method is package protected and not visible
    
            setLayout(createLayout());
    
            assembleSystemMenu();
            createButtons();
            addSubComponents();
        }
    
        protected void addSubComponents() {
            //add(menuBar); // Remove this to disable the menu
            add(iconButton);
            add(maxButton);
            add(closeButton);
        }
    }
    

1 个答案:

答案 0 :(得分:0)

使用关闭按钮回答一个部分。一个解决方案是自己添加关闭按钮(没有内置Swing的选项)。 您必须实现closeTab(…)方法,否则更好的解决方案将是回调处理程序

protected class CloseTabButton extends JPanel {
    private JLabel            titleLabel;

    protected CloseTabButton(JTabbedPane aTabbedPane,
            final AbstractObservableObjectJPanel<M> aDetailPanel,
            String aTitle, Icon anIcon) {
        setOpaque(false);

        titleLabel = new JLabel(aTitle, anIcon, JLabel.LEFT);
        add(titleLabel);
        ImageIcon closeImage = new ImageIcon(
                CloseTabButton.class.getResource("/images/icon_normal.png"));
        Image img = closeImage.getImage();
        Image newimg = img.getScaledInstance(16, 16,
                java.awt.Image.SCALE_SMOOTH);
        ImageIcon closeIcon = new ImageIcon(newimg);

        ImageIcon closeImageRollover = new ImageIcon(
                CloseTabButton.class.getResource("/images/icon_roll.png"));
        Image imgRoll = closeImageRollover.getImage();
        Image newimgRoll = imgRoll.getScaledInstance(16, 16,
                java.awt.Image.SCALE_SMOOTH);
        ImageIcon closeIconRoll = new ImageIcon(newimgRoll);

        JButton btClose = new JButton(closeIcon);
        btClose.setPreferredSize(new Dimension(15, 15));

        add(btClose);
        btClose.setOpaque(false);
        btClose.setContentAreaFilled(false);
        btClose.setBorderPainted(false);

        btClose.setRolloverIcon(closeIconRoll);
        btClose.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent aE) {
                closeTab(aDetailPanel);
            }
        });
        aTabbedPane.setTabComponentAt(
                aTabbedPane.indexOfComponent(aDetailPanel), this);
    }

    public JLabel getTitleLabel() {
        return titleLabel;
    }
}

要添加键盘快捷键,您可以通过

将它们添加到输入地图中
KeyStroke ctrlW = KeyStroke.getKeyStroke(KeyEvent.VK_W,
        InputEvent.CTRL_DOWN_MASK);
getRootPane()
        .getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
        .put(ctrlW, disposeAction.getValue(Action.NAME));

DisposeAction只是一个也调用closeTab(…)

的动作