在JComboBox箭头JButton上附加动作事件

时间:2011-02-20 13:56:11

标签: java swing jcombobox look-and-feel

我尝试在JCombobox箭头JButton上附加动作事件。

所以我做了一个自定义的ComboBoxUI:

public class CustomBasicComboBoxUI extends BasicComboBoxUI {

    public static CustomBasicComboBoxUI createUI(JComponent c) {
        return new CustomBasicComboBoxUI ();
    }

    @Override
    protected JButton createArrowButton() {
        JButton button=super.createArrowButton();
        if(button!=null) {
            button.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    // arrow button clicked
                }
            });
        }
        return button;
    }
}

问题在于组合框的外观不同,看起来很古老。 为什么?我只在同一个箭头按钮上添加一个监听器......

感谢。

1 个答案:

答案 0 :(得分:4)

也许问题是由于您期望JComboBox不是BasicComboBoxUI而是另一种外观和感觉,可能是MetalComboBoxUI。

您可以从现有的JComboBox对象中提取JButton组件,而不是创建新的CustomBasicComboBoxUI对象吗?即,

import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class ComboBoxArrowListener {
   private static void createAndShowUI() {
      String[] data = {"One", "Two", "Three"};
      JComboBox combo = new JComboBox(data);
      JPanel panel = new JPanel();
      panel.add(combo);

      JButton arrowBtn = getButtonSubComponent(combo);
      if (arrowBtn != null) {
         arrowBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
               System.out.println("arrow button pressed");
            }
         });
      }

      JFrame frame = new JFrame("ComboBoxArrowListener");
      frame.getContentPane().add(panel);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   private static JButton getButtonSubComponent(Container container) {
      if (container instanceof JButton) {
         return (JButton) container;
      } else {
         Component[] components = container.getComponents();
         for (Component component : components) {
            if (component instanceof Container) {
               return getButtonSubComponent((Container)component);
            }
         }
      }
      return null;
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}