2013-04-15 4 views
2

У меня есть панель, в которую я положил 2 переключателя. Я хочу реализовать действие двойного щелчка на переключателе, но, похоже, он не работает. В заключение я хочу сделать другой компонент видимым, дважды щелкнув один из переключателей, точнее, щелкнув по его метке.MouseListener на переключателе в качели

Есть ли объяснения, почему слушатель мыши работает только в том случае, если переключатели отключены?

+5

Зачем вам это нужно? Нельзя использовать двойной переключатель. Никто никогда не будет дважды щелкать на вашем переключателе, потому что все пользователи ожидают, что радиокнопка будет работать как все остальные переключатели: вы щелкаете по ней, чтобы выбрать ее, и все. –

+1

true, все еще действительный вопрос tho –

+4

Согласен, его страшный интерфейс. Однако MouseListener отлично работает, хотя нет способа определить, щелкнули ли ярлык или значок. Опубликуйте SSCCE, демонстрируя проблему. – camickr

ответ

3

EDIT:

Проверьте этот код, где мы отделить текст кнопки радио в JLabel/JTextField

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.FocusAdapter; 
import java.awt.event.FocusEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class TestRadioButton { 

    private void initUI() { 
     JFrame frame = new JFrame(TestRadioButton.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS)); 
     final JRadioButton button = new JRadioButton(); 
     final JLabel label = new JLabel("Double click me"); 
     final JTextField editionTF = new JTextField(); 
     editionTF.setOpaque(false); 
     editionTF.addFocusListener(new FocusAdapter() { 
      @Override 
      public void focusLost(FocusEvent e) { 
       stopEdition(panel, label, editionTF); 
      } 

     }); 
     editionTF.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       stopEdition(panel, label, editionTF); 
      } 
     }); 
     label.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       if (e.getClickCount() == 2) { 
        startEdition(panel, label, editionTF); 
       } 
      } 
     }); 
     editionTF.setBorder(BorderFactory.createEmptyBorder()); 
     editionTF.setFont(label.getFont()); 
     editionTF.setVisible(false); 
     panel.add(button); 
     panel.add(label); 
     panel.add(editionTF); 
     frame.add(panel, BorderLayout.NORTH); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    protected void stopEdition(final JPanel panel, final JLabel label, final JTextField editionTF) { 
     label.setText(editionTF.getText()); 
     label.setVisible(true); 
     editionTF.setVisible(false); 
    } 

    protected void startEdition(final JPanel panel, final JLabel label, final JTextField editionTF) { 
     editionTF.setText(label.getText()); 
     label.setVisible(false); 
     editionTF.setVisible(true); 
    } 

    public static void main(String[] args) { 
     final TestRadioButton test = new TestRadioButton(); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       test.initUI(); 
      } 
     }); 
    } 
} 

Не совсем ответ, но комментарии слишком малы для этого. Это отлично работает для меня со следующим кодом. Должна быть какая-то другая проблема, которую вы нам не показываете. Рассмотрите отправку SSCCE

import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JRadioButton; 
import javax.swing.SwingUtilities; 

public class TestRadioButton { 

    private void initUI() { 
     JFrame frame = new JFrame(TestRadioButton.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final JRadioButton button = new JRadioButton("Double click me"); 
     button.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       if (e.getClickCount() == 2) { 
        SwingUtilities.invokeLater(new Runnable() { 

          @Override 
          public void run() { 
           JOptionPane.showMessageDialog(button, "Radio button has been double clicked"); 
          } 
        }; 
       } 
      } 
     }); 

     frame.add(button); 
     frame.setSize(400, 400); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     final TestRadioButton test = new TestRadioButton(); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       test.initUI(); 
      } 
     }); 
    } 
} 
+0

[JOptionPane должен быть завернут в invokeLater] (http://stackoverflow.com/questions/8282488/why-does-setselected-on-jcheckbox-lose-effect), работает или не зависит от версии Java – mKorbel

+0

@mKorbel действительно вероятно, более уместно это сделать, хотя в этом случае мы не попадаем точно в ту же ситуацию, так как мы не заботимся о состоянии переключателя. –

Смежные вопросы