2012-05-25 4 views
1

Java 클래스 인 LAN gomoku/5에 대한 프로젝트를 시작했습니다. 게임 보드는 버튼 (JButton)으로 채워진 2 차원 배열로 표현됩니다. 이벤트 핸들러 (클래스 clickHandler)를 사용하면 클릭 한 버튼 (clickHandler 객체의 매개 변수)에 타원을 그립니다. 내 다음 코드는 작동하지 않았다. (변수 g의 null 값을 제거하는 방법을 모르겠다.) 조언을 해 주시면 감사하겠습니다. 정말 고마워.클릭하면 JButton에 타원을 그리기

class clickHandler implements ActionListener { 

     JButton button; 
     Dimension size; 
     Graphics g; 

     public clickHandler(JButton button) { 
      this.button = button; 
      this.size = this.button.getPreferredSize(); 
     } 

     @Override 
     public void actionPerformed(ActionEvent ae) { 
       this.g.setColor(Color.BLUE); 
       this.g.fillOval(this.button.getHorizontalAlignment(), this.button.getVerticalAlignment(), this.size.width, this.size.height); 

       this.button.paint(this.g); 
       this.button.setEnabled(false); 
     } 
    } 

(GUI를 생성하는 클래스에서 - 버튼의 전체 게임 보드를 - 경우 clickHandler의 인스턴스 - 나는 각 버튼의 새로운 액션 청취자 지정)이 방법 :

gButton.addActionListener(new clickHandler(gButton)); 
+0

이 * ". 내가 충고의 조각을 감사하겠습니다"*는 구부릴 중지하고 사각형 버튼을 타원형에게 모양의 이미지를 넣어. 나는 학교 프로젝트가 타원형 모양의 버튼을 필요로한다는 것을 매우 의심한다. b) 프로젝트 제출에 적합한 시간에 작업을 수행 할 수 있습니다. - 죽이기 - 기쁨이 아니며, 당신이 그 일을 마지막으로 (또는 전혀)하지 말 것을 제안하십시오. –

답변

4

당신이이를 :

  • JButton 클래스를 확장하고 paintComponent(Graphics g) 메서드를 재정의합니다.
  • Dimension 객체를 반환하고 배치에 Layout Manager 도움이 될 것입니다 getPreferredSize() 메소드를 오버라이드 (override) 수행하여 Container/ComponentJButton, 그것을 하나 개의 적절한 크기를 제공함으로써.

  • 서클 코드를 만드세요.

  • onClickListener를 추가하고 클릭 한 버튼에 플래그를 설정하고 다시 칠하기 위해 호출합니다.

Graphics 객체에 대해

: 그것은 paintComponent 방법, 그리고 만이 그것을 사용하기에 그것을 유지하는 것이 가장 좋습니다. 그것은 항상 칠판에 전달 될 것이고, 다른 순간을 위해 그것을 저장하면, 이상한 일들이 일어날 수 있습니다 (행복한 실험 :).).

작은 예 :

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ButtonExample 
{ 
    private MyButton customButton; 

    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Custom Button Example"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     customButton = new MyButton(); 
     customButton.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       MyButton.isClicked = true; 
       customButton.repaint(); 
      } 
     }); 

     frame.getContentPane().add(customButton, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new ButtonExample().displayGUI(); 
      } 
     }); 
    } 
} 

class MyButton extends JButton 
{ 
    public static boolean isClicked = false; 

    public Dimension getPreferredSize() 
    { 
     return (new Dimension(100, 40)); 
    } 

    public void paintComponent(Graphics g) 
    { 
     if (!isClicked) 
      super.paintComponent(g); 
     else 
     { 
      g.setColor(Color.BLUE); 
      g.fillOval(getHorizontalAlignment(), getVerticalAlignment(), getWidth(), getHeight()); 
     }  
    } 
} 
+0

안녕하세요, Hidde, 고맙습니다. 아직 깃발에 익숙하지는 않지만 처음 두 단계를 완료하려고 노력할 것입니다. – Kit

+0

플래그는 확장 된'JBitton' 클래스에서 여러분이 만드는 변수 일뿐입니다. 이 값을 true (또는 1 또는 원하는 값)로 설정하면,'paintComponent' 메소드가 그것이 클릭되었고 원이 필요하다는 것을 알 수 있습니다. – Hidde

+0

@Hidde : 제 편집을 용서해주십시오. 테스트 목적으로 SSCCE를 제공하는 일을 스스로 막을 수는 없었습니다 .--) 거기에있을 필요는 없다고 생각되면 언제든지 되돌릴 수 있고 편집을 취소 할 수 있습니다. –

관련 문제