2013-04-15 4 views
2

2 개의 라디오 버튼을 넣은 패널이 있습니다. 라디오 버튼에 더블 클릭 동작을 구현하려고하지만 작동하지 않는 것 같습니다. 결론적으로 라디오 버튼 중 하나를 두 번 클릭하면서 다른 컴포넌트를 볼 수있게하고 싶습니다. 라벨을 클릭 할 때 더 정확하게 나타납니다.스윙의 라디오 버튼에 MouseListener

라디오 버튼이 비활성화 된 경우에만 마우스 수신기가 작동하는 이유는 무엇입니까?

+5

왜 그렇게 원하십니까? 라디오 버튼은 두 번 클릭하지 않아야합니다. 아무도 당신의 라디오 버튼을 두 번 클릭하지 않을 것입니다. 왜냐하면 모든 사용자는 라디오 버튼이 다른 모든 라디오 버튼처럼 작동하기를 기대하기 때문입니다. 그것을 클릭하여 선택하면됩니다. –

+1

사실, 여전히 유효한 질문입니다. –

+4

나는 그것의 끔찍한 UI에 동의합니다. 그러나 레이블 또는 아이콘을 클릭하면 확인할 수있는 방법은 없지만 MouseListener 잘 작동합니다. 문제를 보여주는 SSCCE를 게시하십시오. – camickr

답변

3

편집 :

체크 아웃 우리가별로 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 실제로 작동하거나 종속되지 않습니다. 이 경우 라디오 버튼 상태에 신경 쓰지 않기 때문에 똑같은 상황에 빠지지는 않지만 그렇게하는 것이 더 적절합니다. –

관련 문제