/* (swing1.1.1beta2) *///package jp.gr.java_conf.tame.swing.examples;import java.util.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.border.*;import javax.swing.plaf.metal.*;import javax.swing.plaf.basic.*;import jp.gr.java_conf.tame.swing.menu.*;/** * @version 1.0 05/10/99 */ public class ComboBoxMenuExample extends JFrame { public ComboBoxMenuExample() { super("ComboBoxMenu Example"); String[] itemStr = { "name" ,"Red" ,"Blue", "number" ,"255,0,0" ,"0,0,255", // separator "system" ,"control" ,"controlHighlight" ,"controlShadow", "text" }; JMenuItem[] menuItems = new JMenuItem[7]; menuItems[0] = new JMenuItem(itemStr[ 1]); menuItems[1] = new JMenuItem(itemStr[ 2]); menuItems[2] = new JMenuItem(itemStr[ 4]); menuItems[3] = new JMenuItem(itemStr[ 5]); menuItems[4] = new JMenuItem(itemStr[ 8]); menuItems[5] = new JMenuItem(itemStr[ 9]); menuItems[6] = new JMenuItem(itemStr[10]); JMenu[] menus = new JMenu[4]; menus[0] = new JMenu(itemStr[0]); menus[1] = new JMenu(itemStr[3]); menus[2] = new JMenu(itemStr[6]); menus[3] = new JMenu(itemStr[7]); menus[0].add(menuItems[0]); menus[0].add(menuItems[1]); menus[1].add(menuItems[2]); menus[1].add(menuItems[3]); menus[3].add(menuItems[4]); menus[3].add(menuItems[5]); menus[2].add(menus[3]); menus[2].add(menuItems[6]); JMenu menu = ComboMenuBar.createMenu(menuItems[0].getText()); menu.add(menus[0]); menu.add(menus[1]); menu.addSeparator(); menu.add(menus[2]); ComboMenuBar comboMenu = new ComboMenuBar(menu); JComboBox combo = new JComboBox(); combo.addItem(itemStr[ 1]); combo.addItem(itemStr[ 2]); combo.addItem(itemStr[ 4]); combo.addItem(itemStr[ 5]); combo.addItem(itemStr[ 8]); combo.addItem(itemStr[ 9]); combo.addItem(itemStr[10]); getContentPane().setLayout(new FlowLayout()); getContentPane().add(new ComboPanel("Fake ComboBox", comboMenu)); getContentPane().add(new ComboPanel("ComboBox" , combo)); } class ComboPanel extends JPanel { ComboPanel(String title, JComponent c) { setLayout(new FlowLayout()); setBorder(new TitledBorder(title)); add(c); } } public static void main (String args[]) { ComboBoxMenuExample frame = new ComboBoxMenuExample(); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0); } }); frame.setSize(370, 100); frame.setVisible(true); } }=======================================
/* (swing1.1.1beta2) */package jp.gr.java_conf.tame.swing.menu;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.border.*;import jp.gr.java_conf.tame.swing.icon.*;/** * @version 1.0 05/10/99 */ public class ComboMenuBar extends JMenuBar { JMenu menu; Dimension preferredSize; public ComboMenuBar(JMenu menu) { this.menu = menu; Color color = UIManager.getColor("Menu.selectionBackground"); UIManager.put("Menu.selectionBackground", UIManager.getColor("Menu.background")); menu.updateUI(); UIManager.put("Menu.selectionBackground", color); MenuItemListener listener = new MenuItemListener(); setListener(menu, listener); add(menu); } class MenuItemListener implements ActionListener { public void actionPerformed(ActionEvent e) { JMenuItem item = (JMenuItem)e.getSource(); menu.setText(item.getText()); menu.requestFocus(); } } private void setListener(JMenuItem item,ActionListener listener) { if (item instanceof JMenu) { JMenu menu = (JMenu)item; int n = menu.getItemCount(); for (int i=0;i<n;i++) { setListener(menu.getItem(i), listener); } } else if (item != null) { // null means separator item.addActionListener(listener); } } public String getSelectedItem() { return menu.getText(); } public void setPreferredSize(Dimension size) { preferredSize = size; } public Dimension getPreferredSize() { if (preferredSize == null) { Dimension sd = super.getPreferredSize(); Dimension menuD = getItemSize(menu); Insets margin = menu.getMargin(); Dimension retD = new Dimension(menuD.width, margin.top + margin.bottom + menuD.height); menu.setPreferredSize(retD); preferredSize = retD; } return preferredSize; } private Dimension getItemSize(JMenu menu) { Dimension d = new Dimension(0,0); int n = menu.getItemCount(); for (int i=0;i<n;i++) { Dimension itemD; JMenuItem item = menu.getItem(i); if (item instanceof JMenu) { itemD = getItemSize((JMenu)item); } else if (item != null) { itemD = item.getPreferredSize(); } else { itemD = new Dimension(0,0); // separator } d.width = Math.max(d.width, itemD.width ); d.height = Math.max(d.height, itemD.height); } return d; } public static class ComboMenu extends JMenu { ArrowIcon iconRenderer; public ComboMenu(String label) { super(label); iconRenderer = new ArrowIcon(SwingConstants.SOUTH, true); setBorder(new EtchedBorder()); setIcon(new BlankIcon(null, 11)); setHorizontalTextPosition(JButton.LEFT); setFocusPainted(true); } public void paintComponent(Graphics g) { super.paintComponent(g); Dimension d = this.getPreferredSize(); int x = Math.max(0, d.width - iconRenderer.getIconWidth() -3); int y = Math.max(0, (d.height - iconRenderer.getIconHeight())/2 -2); iconRenderer.paintIcon(this,g, x,y); } } public static JMenu createMenu(String label) { return new ComboMenu(label); } }==============================================
/* (swing1.1) */package jp.gr.java_conf.tame.swing.icon;import java.awt.*;import javax.swing.*;import javax.swing.plaf.basic.*;/** * @version 1.0 02/26/99 */public class ArrowIcon implements Icon, SwingConstants { private static final int DEFAULT_SIZE = 11; //private static final int DEFAULT_SIZE = 5; private int size; private int iconSize; private int direction; private boolean isEnabled; private BasicArrowButton iconRenderer; public ArrowIcon(int direction, boolean isPressedView) { this(DEFAULT_SIZE, direction, isPressedView); } public ArrowIcon(int iconSize, int direction, boolean isEnabled) { this.size = iconSize / 2; this.iconSize = iconSize; this.direction = direction; this.isEnabled = isEnabled; iconRenderer = new BasicArrowButton(direction); } public void paintIcon(Component c, Graphics g, int x, int y) { iconRenderer.paintTriangle(g, x, y, size, direction, isEnabled); } public int getIconWidth() { //int retCode; switch (direction) { case NORTH: case SOUTH: return iconSize; case EAST: case WEST: return size; } return iconSize; } public int getIconHeight() { switch (direction) { case NORTH: case SOUTH: return size; case EAST: case WEST: return iconSize; } return size; }}===================================================
/* (swing1.1) */package jp.gr.java_conf.tame.swing.icon;import java.awt. *;import javax.swing. *;/** * @version 1.0 02/26/99 */public class BlankIcon implements Icon { private Color fillColor; private int size; public BlankIcon() { this(null, 11); } public BlankIcon(Color color, int size) { //UIManager.getColor("control") //UIManager.getColor("controlShadow") fillColor = color; this.size = size; } public void paintIcon(Component c, Graphics g, int x, int y) { if (fillColor != null) { g.setColor(fillColor); g.drawRect(x, y, size-1, size-1); } } public int getIconWidth() { return size; } public int getIconHeight() { return size; }}