2014-11-18 5 views
0

좋은 하루!누적 된 getClickCount()

한 번 클릭하면 주황색 버튼, 두 번 클릭하면 빨간색 버튼, 3이면 검정색 버튼이 표시됩니다. getClickCount() 값을 누적하는 방법과 관련하여 문제가 있습니다. 단추가 3 번의 클릭을 등록하려면 단추를 3 번 ​​빨리 클릭해야합니다.

여기에 코드

 button1.addMouseListener(new MouseAdapter(){ 
      public void mousePressed(MouseEvent a){ 

       if (a.getClickCount() == 1){ 
       button1.setBackground(Color.ORANGE); 
       } 

       else if (a.getClickCount() == 2){ 
       button1.setBackground(Color.RED); 
       } 

       else if (a.getClickCount() == 3){ 
       button1.setBackground(Color.BLACK); 
       } 
      } 

     }); 

     frame.setVisible(true); 
     frame.pack(); 

    } 
} 
+2

'MouseListener'는 버튼에 적합하지 않습니다. 문제를 나타내는 [실행 가능한 예제] (https://stackoverflow.com/help/mcve)를 제공하십시오. 이렇게하면 혼란이 줄어들고 응답이 향상됩니다. – MadProgrammer

+0

방금 ​​코드를 실행 했으므로 OK (좋지 않음)로 작동합니다. 그러나, 당신이해야 할 일은 모든 버튼 하나가 사용할 수있는 클래스 인'MouseListener'를 만드는 것입니다. 똑같은 일을하는 여러 개의 동일한 익명의 리스너를 생성하고 싶지는 않습니다. 그런 다음 각 단추에 리스너의 독립 인스턴스를 추가하십시오. – hfontanez

+0

'int'를 매개 변수로 얻고 버튼이있는 새 서브 패널을 반환하는 메소드'createButton'을 반드시 만들어야합니다. 현재 해당 코드를 12 번 복사했습니다. 또한 [DRY] (http://en.wikipedia.org/wiki/Don%27t_repeat_yourself)를 읽어보십시오. – Tom

답변

0

1 단계이다 : 당신의 자신의 MouseListener 클래스를 만듭니다. 이 경우, MouseAdapter을 확장하는 외부 클래스를 작성하기로했습니다.

public class MyMouseListener extends MouseAdapter 
{ 
    public void mousePressed(MouseEvent event) 
    { 
     Object obj = event.getSource(); 
     if (obj instanceof JButton) 
     { 
      if JButton btn = (JButton)obj; 

      if (a.getClickCount() == 1) 
      { 
       btn.setBackground(Color.ORANGE); 
      } 

      else if (a.getClickCount() == 2) 
      { 
       btn.setBackground(Color.RED); 
      } 

      else if (a.getClickCount() == 3) 
      { 
       btn.setBackground(Color.BLACK); 
      } 
     } 
    } 
} 

2 단계 : 당신을 위해 일한다 각 버튼

button1.addMouseListener(new MyMouseListener()); 
    button2.addMouseListener(new MyMouseListener()); 
    button3.addMouseListener(new MyMouseListener()); 
    button4.addMouseListener(new MyMouseListener()); 
    button5.addMouseListener(new MyMouseListener()); 
    button6.addMouseListener(new MyMouseListener()); 
    button7.addMouseListener(new MyMouseListener()); 
    button8.addMouseListener(new MyMouseListener()); 
    button9.addMouseListener(new MyMouseListener()); 
    button10.addMouseListener(new MyMouseListener()); 
    button11.addMouseListener(new MyMouseListener()); 
    button12.addMouseListener(new MyMouseListener()); 

이 청취자의 독립적 인 인스턴스를 추가합니다. 그러나, 내가 언급했듯이 이것은 정상적으로 작동하지만 훌륭하지는 않습니다.

1

정확하게 이해하면 기본적으로 버튼을 눌렀을 때마다 버튼을 눌렀을 때마다 색상이 변경됩니다. 버튼이 MouseListener가 감지 어느 것도 programically하고, (지름길 또는 초점 활동을 통해) 키보드에 의해 활성화 될 수

MouseListenerJButton위한 좋은 선택이 아니다.

대신 색상에게 버튼을 누를 때마다 변경됩니다 ActionListener

이 예제를 사용합니다.

Clicker

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class ButtonClicker { 

    public static void main(String[] args) { 
     new ButtonClicker(); 
    } 

    public ButtonClicker() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public static class TestPane extends JPanel { 

     private static final Color[] COLORS = new Color[]{Color.ORANGE, Color.RED, Color.BLACK}; 
     private int clickCount; 

     public TestPane() { 

      setLayout(new GridBagLayout()); 
      JButton clicker = new JButton("Color Changer"); 
      clicker.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        clickCount++; 
        setBackground(COLORS[Math.abs(clickCount % COLORS.length)]); 
       } 
      }); 
      setBackground(COLORS[clickCount]); 
      add(clicker); 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

} 

을 가지고 내가 인생을 간단하게 Color의 배열을 사용했지만, 일반적인 개념은 if-else 문에 대한 작동합니다, 당신은 단지 그것의 한계에 도달 할 때 카운터를 재설정해야 자세한 내용은 How to Use Buttons, Check Boxes, and Radio ButtonsHow to Write an Action Listeners을 참조하십시오.

+0

나는'clickCount = (clickCount + 1) % COLORS.length;'를하고 싶습니다. – Radiodef

+0

@Radiodef 왜? 배열은 0으로 인덱싱됩니까? 아니면 'COLORS.length - 1'이어야합니까? – MadProgrammer

+0

오버플로를 방지하기 위해 – Radiodef