Java JComboBox箭头按钮的工具提示位置
我正在编写一个简单的swing程序,其中创建了一个JFrame并向其中添加了一个自定义JComboBoxJava 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
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);
// }
}