Java JComboBox箭头按钮的工具提示位置

Java JComboBox箭头按钮的工具提示位置,java,swing,jcombobox,Java,Swing,Jcombobox,我正在编写一个简单的swing程序,其中创建了一个JFrame并向其中添加了一个自定义JComboBox public class CustomJComboBox<T> extends JComboBox<T> { public static void main(String[] args) { new CustomJComboBox<>().initUI(); } /** * */ private static final long ser

我正在编写一个简单的swing程序,其中创建了一个JFrame并向其中添加了一个自定义JComboBox

public class CustomJComboBox<T> extends JComboBox<T> {

public static void main(String[] args) {
    new CustomJComboBox<>().initUI();
}

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Override
public Point getToolTipLocation(MouseEvent event) {
    System.out.println("getToolTipLocation called");
    return super.getToolTipLocation(event);
}

private void initUI() {

    JComboBox<String> box = new CustomJComboBox<>();

    box.addItem("Item 1");
    box.addItem("Item 2");

    box.setToolTipText("TooTip");

    JFrame frame = new JFrame();

    frame.setBounds(0, 0, 300, 300);

    frame.add(box);

    frame.setVisible(true);

}

}
公共类CustomJComboBox扩展了JComboBox{
公共静态void main(字符串[]args){
新建CustomJComboBox().initUI();
}
/**
* 
*/
私有静态最终长serialVersionUID=1L;
@凌驾
公共点getToolTipLocation(MouseeEvent事件){
System.out.println(“调用getToolTipLocation”);
返回super.gettooltipplocation(事件);
}
私有void initUI(){
JComboBox=new CustomJComboBox();
附录(第1项);
附录(第2项);
box.setToolTipText(“TooTip”);
JFrame=新JFrame();
框架立根(0,0,300,300);
框架。添加(框);
frame.setVisible(true);
}
}
当我将鼠标放在combobox上时,会调用重写的getToolTipLocation()方法,但当我将鼠标放在下拉箭头按钮上时,此方法不会作为单独的JButton调用


是否有方法控制箭头按钮的工具提示位置?

尝试添加
MouseMotionListener
,将鼠标事件传输到父
JComboBox
,并将其添加到
箭头按钮

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//import javax.swing.plaf.metal.*;

public class CustomJComboBoxTest {
  public JComponent makeUI() {
    JComboBox<String> box = new JComboBox<String>() {
      private transient MouseAdapter handler;
      @Override public Point getToolTipLocation(MouseEvent e) {
        System.out.println("getToolTipLocation called");
        return super.getToolTipLocation(e);
      }
      @Override public void updateUI() {
        for (Component c : getComponents()) {
          if (c instanceof JButton) {
            ((JButton) c).removeMouseListener(handler);
            ((JButton) c).removeMouseMotionListener(handler);
          }
        }
        super.updateUI();
        handler = new ComboBoxMouseEventHelper();
        for (Component c : getComponents()) {
          if (c instanceof JButton) {
            ((JButton) c).addMouseListener(handler);
            ((JButton) c).addMouseMotionListener(handler);
          }
        }
//         //TEST:
//         setUI(new BasicComboBoxUI() {
//           @Override protected JButton createArrowButton() {
//             //JButton button = super.createArrowButton();
//             boolean iconOnly = true;
//             JButton button = new MetalComboBoxButton(comboBox, new MetalComboBoxIcon(),
//             iconOnly, currentValuePane, listBox) {
//               @Override public Point getToolTipLocation(MouseEvent e) {
//                 System.out.println("ArrowButton: getToolTipLocation called");
//                 return super.getToolTipLocation(e);
//               }
//             };
//             button.setMargin(new Insets(0, 1, 1, 3));
//             button.setName("ComboBox.arrowButton");
//             return button;
//           }
//         });
      }
    };
    box.addItem("Item 1");
    box.addItem("Item 2");
    box.setToolTipText("TooTip");

    JPanel p = new JPanel(new BorderLayout());
    p.setBorder(BorderFactory.createEmptyBorder(60, 20, 60, 20));
    p.add(box);
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new CustomJComboBoxTest().makeUI());
      f.setSize(320, 240);
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}

class ComboBoxMouseEventHelper extends MouseAdapter {
  private void dispatchEvent(MouseEvent e) {
    Component s = e.getComponent();
    Container c = SwingUtilities.getAncestorOfClass(JComboBox.class, s);
    if (c instanceof JComboBox) {
      ((JComboBox) c).dispatchEvent(SwingUtilities.convertMouseEvent(s, e, c));
    }
  }
// @Override public void mouseClicked(MouseEvent e) {
//   dispatchEvent(e);
// }
  @Override public void mouseEntered(MouseEvent e) {
    dispatchEvent(e);
  }
  @Override public void mouseExited(MouseEvent e) {
    dispatchEvent(e);
  }
// @Override public void mousePressed(MouseEvent e) {
//   dispatchEvent(e);
// }
// @Override public void mouseReleased(MouseEvent e) {
//   dispatchEvent(e);
// }
  @Override public void mouseMoved(MouseEvent e) {
    dispatchEvent(e);
  }
// @Override public void mouseDragged(MouseEvent e) {
//   dispatchEvent(e);
// }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
//导入javax.swing.plaf.metal.*;
公共类CustomJComboxTest{
公共JComponent makeUI(){
JComboBox=newjcombobox(){
专用瞬态鼠标捕捉器处理程序;
@覆盖公共点getToolTipLocation(MouseeEvent e){
System.out.println(“调用getToolTipLocation”);
返回super.gettooltipplocation(e);
}
@重写公共void updateUI(){
对于(组件c:getComponents()){
if(JButton的c实例){
((JButton)c)移除mouselistener(handler);
((JButton)c).removeMouseMotionListener(处理程序);
}
}
super.updateUI();
handler=new-ComboBoxMouseEventHelper();
对于(组件c:getComponents()){
if(JButton的c实例){
(JButton)c.addMouseListener(handler);
((JButton)c).addMouseMotionListener(handler);
}
}
////测试:
//setUI(新的BasicComboxUI(){
//@覆盖受保护的JButton createArrowButton(){
////JButton button=super.createArrowButton();
//布尔i非线性=真;
//JButton button=new metalcomboxbutton(组合框,new metalcomboxIcon(),
//IConly、currentValuePane、listBox){
//@Override public Point getToolTipLocation(MouseEvent e){
//System.out.println(“箭头按钮:调用getToolTipLocation”);
//返回super.gettooltipplocation(e);
//               }
//             };
//设置边距(新的插图(0,1,1,3));
//button.setName(“ComboBox.arrowButton”);
//返回按钮;
//           }
//         });
}
};
附录(第1项);
附录(第2项);
box.setToolTipText(“TooTip”);
JPanel p=newjpanel(newborderlayout());
p、 setBorder(BorderFactory.createEmptyByOrder(60,20,60,20));
p、 添加(框);
返回p;
}
公共静态void main(字符串[]args){
EventQueue.invokeLater(()->{
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 getContentPane().add(新的CustomJComboxTest().makeUI());
f、 设置大小(320240);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
});
}
}
类ComboBoxMouseEventHelper扩展了MouseAppter{
私有无效调度事件(MouseEvent e){
组件s=e.getComponent();
容器c=SwingUtilities.getAncestorOfClass(JComboBox.class,s);
if(JComboBox的c实例){
((JComboBox)c)、dispatchEvent(SwingUtilities.convertMouseEvent(s、e、c));
}
}
//@Override public void mouseClicked(MouseEvent e){
//调度事件(e);
// }
@覆盖公共无效鼠标事件(鼠标事件e){
调度事件(e);
}
@覆盖公共void mouseExited(MouseEvent e){
调度事件(e);
}
//@Override public void mousePressed(MouseEvent e){
//调度事件(e);
// }
//@Override public void mouseereleased(MouseEvent e){
//调度事件(e);
// }
@覆盖公共void mouseMoved(MouseEvent e){
调度事件(e);
}
//@Override public void mouseDragged(MouseEvent e){
//调度事件(e);
// }
}