Edit
Downvoter, how is this a bad question? I have provided runnable example code of the issue. If it works for you please let me know or point out what is unclear.
Hello,
in the code below which has a single JComboBox
in a JFrame
, I am not notified when the mouse enters the JComboBox
or is clicked or focus gained. However, the PopupMenuEvent
works properly.
What am I doing wrong? (My goal is to be alerted when the text component of the JComboBox is clicked)
public class TestJComboBox extends javax.swing.JFrame
{
public TestJComboBox()
{
initComponents();
}
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jComboBox1 = new javax.swing.JComboBox();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
formMouseClicked(evt);
}
});
jComboBox1.setEditable(true);
jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
jComboBox1.setName("jComboBox1"); // NOI18N
jComboBox1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jComboBox1MouseClicked(evt);
}
public void mouseEntered(java.awt.event.MouseEvent evt) {
jComboBox1MouseEntered(evt);
}
});
jComboBox1.addPopupMenuListener(new javax.swing.event.PopupMenuListener() {
public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) {
}
public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {
}
public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {
jComboBox1PopupMenuWillBecomeVisible(evt);
}
});
jComboBox1.addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
jComboBox1FocusGained(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(70, 70, 70)
.addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 226, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(104, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(90, 90, 90)
.addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(164, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void jComboBox1FocusGained(java.awt.event.FocusEvent evt)
{
System.out.println("JComboBox Focus gained");
}
private void formMouseClicked(java.awt.event.MouseEvent evt)
{
System.out.println("Form clicked");
jComboBox1.setFocusable(false);
jComboBox1.setFocusable(true);
}
private void jComboBox1MouseClicked(java.awt.event.MouseEvent evt)
{
System.out.println("JComboBox Click");
}
private void jComboBox1PopupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt)
{
System.out.println("JComboBox Visible menu");
}
private void jComboBox1MouseEntered(java.awt.event.MouseEvent evt)
{
System.out.println("Entered JComboBox");
}
public static void main(String args[])
{
java.awt.EventQueue.invokeLater(new Runnable()
{
public void run()
{
new TestJComboBox().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JComboBox jComboBox1;
// End of variables declaration
}
Thanks!
JComboBox() : creates a new empty JComboBox . JComboBox(ComboBoxModel M) : creates a new JComboBox with items from specified ComboBoxModel. JComboBox(E [ ] i) : creates a new JComboBox with items from specified array. JComboBox(Vector items) : creates a new JComboBox with items from the specified vector.
u can make ur jcombobox uneditable by calling its setEnabled(false). A JComboBox is unEditable by default. You can make it editable with the setEditable(boolean) command. If you are talking about enabled or disabled you can set that by the setEnabled(boolean) method.
getRenderer. Returns the renderer used to display the selected item in the JComboBox field.
Possibly the downvoter took offense at your use of Netbeans GUI editor. I don't like it myself, but you're welcome to use it if you find that you can actually maintain a complex gui with it. I personally hate it due to various extremely annoying bugs that only show themselves when you're trying to edit the form and it quietly loses your layout and component settings. But that's beside the point.
Anyway, you need to add your ActionListener like this:
jComboBox1.getEditor().getEditorComponent().addMouseListener(...);
JComboBox is really a composite component with a JTextField, JButton, and JList buried inside it, so you were adding the ActionListener to the wrapping component, when the mouse events are really going to the inner JTextField.
"My goal is to be alerted when the text component of the JComboBox is clicked"
This can be achieved by adding FocusListener to the underlying JTextField Component of JComboBox that will respond as expected to gain and loss of focus for the ComboBox.
Component component = comboBox.getEditor().getEditorComponent();
if (component instanceof JTextField){
JTextField txtFiled = (JTextField) borderless;
txtFiled.addFocusListener(new FocusListener()
{
public void focusGained(FocusEvent e)
{
//To Do Focus Gained
}
public void focusLost(FocusEvent e)
{
//To Do Focus Lost
}
});
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With