/* * JPanelButton.java * * Created on November 19, 2004, 9:48 AM */ package ngmfconsole; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Graphics; import java.awt.Insets; import java.awt.Point; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.Action; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JToggleButton; import javax.swing.JToolBar; import javax.swing.SwingUtilities; import javax.swing.UIManager; /** Panel Button * * @author Olaf David */ public class JPanelButton extends JToggleButton { private JPanel windowPanel; private Container window; public JPanelButton(Action a) { super(a); } public JPanelButton() { this("", null); } public JPanelButton(Icon icon) { this("", icon); } public JPanelButton(String text, Icon icon) { super(text, icon, false); } @Override public void setText(String text) { String t = text == null ? null : text + " "; super.setText(t); } public void setWindowPanel(JPanel windowPanel) { this.windowPanel = windowPanel; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Color c = g.getColor(); // g.setColor(isEnabled() ? Color.GRAY : Color.LIGHT_GRAY); g.setColor(isEnabled() ? Color.BLACK : Color.GRAY); Insets i = getInsets(); // int opSize = getFontMetrics(getFont()).stringWidth("M") / 2; int opSize = 2; int newx = getWidth() - i.right - 2 * opSize; int newy = (int) (getHeight() * 0.75); g.translate(newx, newy); g.drawLine(-opSize, 0, opSize, 0); if (!isSelected()) { g.drawLine(0, -opSize, 0, opSize); } g.translate(-newx, -newy); g.setColor(c); } @Override protected void fireActionPerformed(ActionEvent event) { Container w = getWindow(); if (isSelected()) { adjustWindow(w); w.setVisible(true); w.requestFocus(); } else { w.setVisible(false); } } private void adjustWindow(Container w) { Point p = new Point(); SwingUtilities.convertPointToScreen(p, this); w.setLocation(p.x, p.y + getHeight()); } private synchronized Container getWindow() { if (window == null) { window = createWindow(); } return window; } private Container createWindow() { Component root = SwingUtilities.getRoot(this); final JDialog win = new JDialog((Window) root); win.setUndecorated(true); ComponentListener cl = new ComponentAdapter() { @Override public void componentMoved(ComponentEvent e) { if (isSelected()) { adjustWindow(win); } } }; root.addComponentListener(cl); win.getContentPane().add(windowPanel); win.setFocusable(true); win.pack(); return win; } public static Component panelButton(PropertyChangeListener l) { JPanelButton t = new JPanelButton(); t.setFocusPainted(false); ImageIcon runIcon = new ImageIcon(JPanelButton.class.getResource( // "/ngmfconsole/resources/settings-icon.png")); "/ngmfconsole/resources/oxygen/Categories-preferences-system-icon.png")); t.setIcon(runIcon); t.setWindowPanel(new Preferences(l)); t.setBorderPainted(false); t.setRolloverEnabled(true); t.setToolTipText("Options and Settings."); return t; } public static void main(String args[]) throws Exception { UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); // UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); JToolBar toolbar = new JToolBar(); toolbar.add(panelButton(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { System.out.println(evt.getPropertyName() + " " + evt.getNewValue()); } })); JFrame f = new JFrame(); // toolbar.add(panelButton1(true, new BeanNode(new Bean()))); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(toolbar, BorderLayout.NORTH); f.getContentPane().add(new JLabel("test"), BorderLayout.CENTER); f.setSize(500, 500); f.setLocation(200, 300); f.setVisible(true); } }