📄 basicinternalframetitlepane.java
字号:
* @param a The Action that the button uses. */ public PaneButton(Action a) { super(a); setMargin(new Insets(0, 0, 0, 0)); } /** * This method returns true if the Component can be focused. * * @return false. */ public boolean isFocusable() { // These buttons cannot be given focus. return false; } } /** The action command for the Close action. */ protected static final String CLOSE_CMD = "Close"; /** The action command for the Minimize action. */ protected static final String ICONIFY_CMD = "Minimize"; /** The action command for the Maximize action. */ protected static final String MAXIMIZE_CMD = "Maximize"; /** The action command for the Move action. */ protected static final String MOVE_CMD = "Move"; /** The action command for the Restore action. */ protected static final String RESTORE_CMD = "Restore"; /** The action command for the Size action. */ protected static final String SIZE_CMD = "Size"; /** The action associated with closing the JInternalFrame. */ protected Action closeAction; /** The action associated with iconifying the JInternalFrame. */ protected Action iconifyAction; /** The action associated with maximizing the JInternalFrame. */ protected Action maximizeAction; /** The action associated with moving the JInternalFrame. */ protected Action moveAction; /** The action associated with restoring the JInternalFrame. */ protected Action restoreAction; /** The action associated with resizing the JInternalFrame. */ protected Action sizeAction; /** The button that closes the JInternalFrame. */ protected JButton closeButton; /** The button that iconifies the JInternalFrame. */ protected JButton iconButton; /** The button that maximizes the JInternalFrame. */ protected JButton maxButton; /** The icon displayed in the restore button. */ protected Icon minIcon = BasicIconFactory.createEmptyFrameIcon(); /** The icon displayed in the maximize button. */ protected Icon maxIcon = BasicIconFactory.createEmptyFrameIcon(); /** The icon displayed in the iconify button. */ protected Icon iconIcon = BasicIconFactory.createEmptyFrameIcon(); /** The icon displayed in the close button. */ protected Icon closeIcon; /** The JInternalFrame that this TitlePane is used in. */ protected JInternalFrame frame; /** The JMenuBar that is located at the top left of the Title Pane. */ protected JMenuBar menuBar; /** The JMenu inside the menuBar. */ protected JMenu windowMenu; /** * The text color of the TitlePane when the JInternalFrame is not selected. */ protected Color notSelectedTextColor; /** * The background color of the TitlePane when the JInternalFrame is not * selected. */ protected Color notSelectedTitleColor; /** The text color of the titlePane when the JInternalFrame is selected. */ protected Color selectedTextColor; /** * The background color of the TitlePane when the JInternalFrame is * selected. */ protected Color selectedTitleColor; /** The Property Change listener that listens to the JInternalFrame. */ protected PropertyChangeListener propertyChangeListener; /** * The label used to display the title. This label is not added to the * TitlePane. * This is package-private to avoid an accessor method. */ transient JLabel title; /** * Creates a new BasicInternalFrameTitlePane object that is used in the * given JInternalFrame. * * @param f The JInternalFrame this BasicInternalFrameTitlePane will be used * in. */ public BasicInternalFrameTitlePane(JInternalFrame f) { frame = f; setLayout(createLayout()); title = new JLabel(); title.setHorizontalAlignment(SwingConstants.LEFT); title.setHorizontalTextPosition(SwingConstants.LEFT); title.setOpaque(false); setOpaque(true); setBackground(Color.LIGHT_GRAY); setOpaque(true); installTitlePane(); } /** * This method installs the TitlePane onto the JInternalFrameTitlePane. It * also creates any children components that need to be created and adds * listeners to the appropriate components. */ protected void installTitlePane() { installDefaults(); installListeners(); createActions(); assembleSystemMenu(); createButtons(); setButtonIcons(); addSubComponents(); enableActions(); } /** * This method adds the sub components to the TitlePane. */ protected void addSubComponents() { add(menuBar); add(closeButton); add(iconButton); add(maxButton); } /** * This method creates the actions that are used to manipulate the * JInternalFrame. */ protected void createActions() { closeAction = new CloseAction(); closeAction.putValue(AbstractAction.ACTION_COMMAND_KEY, CLOSE_CMD); iconifyAction = new IconifyAction(); iconifyAction.putValue(AbstractAction.ACTION_COMMAND_KEY, ICONIFY_CMD); maximizeAction = new MaximizeAction(); maximizeAction.putValue(AbstractAction.ACTION_COMMAND_KEY, MAXIMIZE_CMD); sizeAction = new SizeAction(); sizeAction.putValue(AbstractAction.ACTION_COMMAND_KEY, SIZE_CMD); restoreAction = new RestoreAction(); restoreAction.putValue(AbstractAction.ACTION_COMMAND_KEY, RESTORE_CMD); moveAction = new MoveAction(); moveAction.putValue(AbstractAction.ACTION_COMMAND_KEY, MOVE_CMD); } /** * This method is used to install the listeners. */ protected void installListeners() { propertyChangeListener = createPropertyChangeListener(); frame.addPropertyChangeListener(propertyChangeListener); } /** * This method is used to uninstall the listeners. */ protected void uninstallListeners() { frame.removePropertyChangeListener(propertyChangeListener); propertyChangeListener = null; } /** * This method installs the defaults determined by the look and feel. */ protected void installDefaults() { title.setFont(UIManager.getFont("InternalFrame.titleFont")); selectedTextColor = UIManager.getColor("InternalFrame.activeTitleForeground"); selectedTitleColor = UIManager.getColor("InternalFrame.activeTitleBackground"); notSelectedTextColor = UIManager.getColor("InternalFrame.inactiveTitleForeground"); notSelectedTitleColor = UIManager.getColor("InternalFrame.inactiveTitleBackground"); closeIcon = UIManager.getIcon("InternalFrame.closeIcon"); iconIcon = UIManager.getIcon("InternalFrame.iconifyIcon"); maxIcon = UIManager.getIcon("InternalFrame.maximizeIcon"); } /** * This method uninstalls the defaults. */ protected void uninstallDefaults() { setFont(null); selectedTextColor = null; selectedTitleColor = null; notSelectedTextColor = null; notSelectedTitleColor = null; closeIcon = null; iconIcon = null; maxIcon = null; } /** * This method creates the buttons used in the TitlePane. */ protected void createButtons() { closeButton = new PaneButton(closeAction); closeButton.setText(null); if (!frame.isClosable()) closeButton.setVisible(false); iconButton = new PaneButton(iconifyAction); iconButton.setText(null); if (!frame.isIconifiable()) iconButton.setVisible(false); maxButton = new PaneButton(maximizeAction); maxButton.setText(null); if (!frame.isMaximizable()) maxButton.setVisible(false); } /** * Set icons for the minimize-, maximize- and close-buttons. */ protected void setButtonIcons() { if (closeIcon != null && closeButton != null) closeButton.setIcon(closeIcon); if (iconIcon != null && iconButton != null) iconButton.setIcon(iconIcon); if (maxIcon != null && maxButton != null) maxButton.setIcon(maxIcon); } /** * This method creates the MenuBar used in the TitlePane. */ protected void assembleSystemMenu() { menuBar = createSystemMenuBar(); windowMenu = createSystemMenu(); menuBar.add(windowMenu); addSystemMenuItems(windowMenu); enableActions(); } /** * This method adds the MenuItems to the given JMenu. * * @param systemMenu The JMenu to add MenuItems to. */ protected void addSystemMenuItems(JMenu systemMenu) { JMenuItem tmp; tmp = new JMenuItem(RESTORE_CMD); tmp.addActionListener(restoreAction); tmp.setMnemonic(KeyEvent.VK_R); systemMenu.add(tmp); tmp = new JMenuItem(MOVE_CMD); tmp.addActionListener(moveAction); tmp.setMnemonic(KeyEvent.VK_M); systemMenu.add(tmp); tmp = new JMenuItem(SIZE_CMD); tmp.addActionListener(sizeAction); tmp.setMnemonic(KeyEvent.VK_S); systemMenu.add(tmp); tmp = new JMenuItem(ICONIFY_CMD); tmp.addActionListener(iconifyAction); tmp.setMnemonic(KeyEvent.VK_N); systemMenu.add(tmp); tmp = new JMenuItem(MAXIMIZE_CMD); tmp.addActionListener(maximizeAction); tmp.setMnemonic(KeyEvent.VK_X); systemMenu.add(tmp); systemMenu.addSeparator(); tmp = new JMenuItem(CLOSE_CMD); tmp.addActionListener(closeAction); tmp.setMnemonic(KeyEvent.VK_C); systemMenu.add(tmp); } /** * This method creates a new JMenubar. * * @return A new JMenuBar. */ protected JMenuBar createSystemMenuBar() { if (menuBar == null) menuBar = new SystemMenuBar(); menuBar.removeAll(); return menuBar; } /** * This method creates a new JMenu. * * @return A new JMenu. */ protected JMenu createSystemMenu() { if (windowMenu == null) windowMenu = new JMenu(); windowMenu.removeAll(); return windowMenu; } /** * This method programmatically shows the JMenu. */ protected void showSystemMenu() { // FIXME: Untested as KeyEvents are not hooked up. menuBar.getMenu(1).getPopupMenu().show(); } /** * This method paints the TitlePane. * * @param g The Graphics object to paint with. */ public void paintComponent(Graphics g) { paintTitleBackground(g); if (frame.getTitle() != null && title != null) { Color saved = g.getColor(); Font f = title.getFont(); g.setFont(f); FontMetrics fm = g.getFontMetrics(f); if (frame.isSelected()) g.setColor(selectedTextColor); else g.setColor(notSelectedTextColor); title.setText(getTitle(frame.getTitle(), fm, title.getBounds().width)); SwingUtilities.paintComponent(g, title, null, title.getBounds()); g.setColor(saved); } } /** * This method paints the TitlePane's background. * * @param g The Graphics object to paint with. */ protected void paintTitleBackground(Graphics g) { if (!isOpaque()) return; Color saved = g.getColor(); Dimension dims = getSize(); Color bg = getBackground(); if (frame.isSelected()) bg = selectedTitleColor; else bg = notSelectedTitleColor; g.setColor(bg); g.fillRect(0, 0, dims.width, dims.height); g.setColor(saved); } /** * This method returns the title string based on the available width and the * font metrics. * * @param text The desired title. * @param fm The FontMetrics of the font used. * @param availableWidth The available width. * * @return The allowable string. */ protected String getTitle(String text, FontMetrics fm, int availableWidth) { Rectangle vr = new Rectangle(0, 0, availableWidth, fm.getHeight()); Rectangle ir = new Rectangle(); Rectangle tr = new Rectangle(); String value = SwingUtilities.layoutCompoundLabel(this, fm, text, null, SwingConstants.CENTER, SwingConstants.LEFT, SwingConstants.CENTER, SwingConstants.LEFT, vr, ir, tr, 0); return value; } /** * This method fires something similar to a WINDOW_CLOSING event. * * @param frame The JInternalFrame that is being closed. */ protected void postClosingEvent(JInternalFrame frame) { // FIXME: Implement postClosingEvent when I figure out what // it's supposed to do. // It says that this fires an WINDOW_CLOSING like event. // So the closest thing is some kind of InternalFrameEvent. // But none is fired. // Can't see it called or anything. } /** * This method enables the actions for the TitlePane given the frame's * properties. */ protected void enableActions() { closeAction.setEnabled(frame.isClosable()); iconifyAction.setEnabled(frame.isIconifiable()); // The maximize action is responsible for restoring it // as well, if clicked from the button maximizeAction.setEnabled(frame.isMaximizable()); // The restoring action is only active when selected // from the menu. restoreAction.setEnabled(frame.isMaximum()); sizeAction.setEnabled(frame.isResizable()); // FIXME: Tie MoveAction enabled status to a variable. moveAction.setEnabled(false); } /** * This method creates a new PropertyChangeListener. * * @return A new PropertyChangeListener. */ protected PropertyChangeListener createPropertyChangeListener() { return new PropertyChangeHandler(); } /** * This method creates a new LayoutManager for the TitlePane. * * @return A new LayoutManager. */ protected LayoutManager createLayout() { return new TitlePaneLayout(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -