not the answer you need to find
paint () to heavy, paintComponent () for lightweight JPopup, JMenu (for custom coloring, you can switch to isHeavyWeight ...)
put JLabel in a container (some questions about JTable by @Guillaume Polet and @Robin)
create your own JMenu / JPopup (see my comment on your question)


import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.border.EtchedBorder; import javax.swing.border.TitledBorder; import javax.swing.plaf.basic.BasicArrowButton; public class ComboBoxMenuExample extends JFrame { public ComboBoxMenuExample() { super("ComboBoxMenu Example"); String[] itemStr = {"name", "Red", "Blue", "number", "255,0,0", "0,0,255", "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[]) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception evt) { } ComboBoxMenuExample frame = new ComboBoxMenuExample(); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setSize(370, 100); frame.setVisible(true); } } 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")); UIManager.put("Menu.selectionBackground", color); menu.updateUI(); MenuItemListener listener = new MenuItemListener(); setListener(menu, listener); add(menu); } class MenuItemListener implements ActionListener { @Override 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 menu1 = (JMenu) item; int n = menu1.getItemCount(); for (int i = 0; i < n; i++) { setListener(menu1.getItem(i), listener); } } else if (item != null) {
source share