2016-11-13 2 views
0

Jtogglebutton의 배경색을 동적으로 설정하는 데 문제가 있습니다. Jtogglebutton이 500ms와 같은 결정적인 시간에 켜고 끄는 것처럼 깜박 거리고 싶습니다. 나는 paint와 paintComponent 메소드를 오버라이드하려고 시도했다. 그러나 어느 쪽도 성공할 수 없었다. 나는 붙어있다. 여기 내 코드 덕분에 도움이됩니다.동적으로 배경을 설정하는 Jtogglebutton

주도 클래스 :

public class Led extends JToggleButton { 
private Color okColor = Color.GREEN; 
private Color notOkColor = Color.RED; 
private static int BLINK_FREQUENCY=500; 

public Led() { 
    this.setPreferredSize(new Dimension(50, 50)); 
    timer.start(); 
} 

Timer timer=new Timer(BLINK_FREQUENCY, new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
      setBackground(okColor); 
      System.out.println("ok"); 
      try { 
       Thread.sleep(BLINK_FREQUENCY); 
      } catch (InterruptedException e1) { 
       e1.printStackTrace(); 
      } 
      setBackground(notOkColor); 
      System.out.println("notok"); 
    } 
}); 

}

메인 프레임 클래스 :

public class MainFrame { 

private JFrame frame; 
private Led led; 
private JPanel panel; 

public MainFrame() { 
    initializeComponents(); 
} 

private void initializeComponents() { 
    frame = new JFrame("Blinking Led"); 
    frame.setSize(400, 400); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    { 
     panel = new JPanel(); 
     led = new Led(); 
     panel.add(led); 
     frame.add(panel); 
    } 

} 

public void setVisible(boolean visible) { 
    frame.setVisible(visible); 
} 

} 내가 Timer 클래스를 사용하여 지점이 표시되지 않는

+0

1) 빨리 더 도움 들어, [MCVE] 또는 게시 [포함 된 짧은, 자기를 올바른 예 (http://www.sscce.org/). 2) 더 이상 고칠 수없는 문제에 대해서는 [코드 블록의 걸쇠 대괄호 탐지/수정] (http://meta.stackexchange.com/q/251795/155831)을 참조하십시오. –

+0

잘 모르겠다. 색상을 500ms마다 전환하고 싶거나 단추의 상태를 전환 한 다음 색상 전환을 실행하고 싶습니까? –

+0

버튼의 색을 500ms마다 전환하고 싶습니다. 국가는 중요하지 않습니다. –

답변

-1

하지만 단순한 스레드가 작동해야합니다.

public Led() { 
    this.setPreferredSize(new Dimension(50, 50)); 
    thread.start(); 
} 

Thread thread = new Thread(() -> { 
        while (true) { 
         if (getBackground().equals(notOkColor)) { 
          setBackground(okColor); 
         } else { 
          setBackground(notOkColor); 
         } 
         try { 
          Thread.sleep(BLINK_FREQUENCY); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
        } 
       }); 
+0

:) 감사. 그것은 나를 많이 도왔다. 페인트 법으로 만들 생각이 있습니까? –

+0

요점은 EDT에서 GUI 관련 코드를 실행하는 것입니다. – Antoniossss

+0

@Antoniossss 아니요 코드에서 사용하지 않는 ActionListener 및 ActionEvent를 제공하는 클래스를 사용하는 데는 전혀 요점이 없습니다. 올바른 방법은 SwingUtils.invokeLater()를 사용하여 EDT에서 revalidate() 및 repaint()를 수동으로 호출하는 것이지만이 경우에도 필요하지는 않습니다. –

1

가이 거의 완료 :

Timer timer=new Timer(BLINK_FREQUENCY, new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
      setBackgroundColor(getBackgroundColor()==okColor ? noOkColor:okColor); 
    } 
    }); 

timer.start(); 
관련 문제