I have added a MouseListener to a JComboBox however, parts of the JComboBox are not listening to the mouselistener. Whenever I move my cursor over the JComboBox list or the JComboBox button the mouse-over is "lost". Why is this and even better, how can I work arround this problem?
Thanks!
edit: The code sample can be run out of the box.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
/**
*
* @author killingdjef
*/
public class ComboBoxListenerBug extends JFrame {
public ComboBoxListenerBug()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(new ComboBoxListenerBugPanel());
this.pack();
}
public static void main(String[] args)
{
ComboBoxListenerBug app = new ComboBoxListenerBug();
app.setVisible(true);
}
}
class ComboBoxListenerBugPanel extends JPanel implements MouseListener {
private boolean mouseOver;
private int h;
private int w;
private Color topGradientColour = Color.black;
private Color bottomGradientColour = Color.white;
private GradientPaint gradient;
private LineBorder visibleBorder = new LineBorder(new Color(204, 204, 204));
private int rectX1;
private int rectX2;
private int rectY1;
private int rectY2;
private JComboBox testComboBox;
public ComboBoxListenerBugPanel()
{
this.setPreferredSize(new Dimension(400, 400));
this.setOpaque(false);
testComboBox = new JComboBox();
testComboBox.setPreferredSize(new Dimension(200, 30));
testComboBox.addItem("why");
testComboBox.addItem("wont");
testComboBox.addItem("it");
testComboBox.addItem("work");
testComboBox.addMouseListener(this);
this.add(testComboBox);
}
protected void paintComponent(Graphics g)
{
h = getHeight();
w = getWidth();
Graphics2D g2 = (Graphics2D) g;
if (isMouseOver() == false)
{
gradient = new GradientPaint(0, 0, topGradientColour, 0, h, bottomGradientColour);
setBorder(null);
}
else
{
gradient = new GradientPaint(0, 0, bottomGradientColour, 0, h, topGradientColour);
setBorder(visibleBorder);
}
g2.setPaint(gradient);
g2.fillRect(0, 0, w, h);
super.paintComponent(g);
rectX1 = this.getLocationOnScreen().x + 10;
rectY1 = this.getLocationOnScreen().y + 10;
}
public boolean isMouseOver()
{
return mouseOver;
}
public void setMouseOver(boolean mouseOver)
{
this.mouseOver = mouseOver;
}
@Override
public void mouseClicked(MouseEvent e)
{
}
@Override
public void mousePressed(MouseEvent e)
{
}
@Override
public void mouseReleased(MouseEvent e)
{
}
@Override
public void mouseEntered(MouseEvent e)
{
setMouseOver(true);
repaint();
}
@Override
public void mouseExited(MouseEvent e)
{
setMouseOver(false);
repaint();
}
}
Edited by: killingdjef on Nov 5, 2008 6:38 PM