2012-04-10 3 views
0

버튼을 눌러 내 보드를 업데이트하려고 할 때 벽에 충돌했습니다. GameBoard 클래스가 다시 그리는 데 필요한 클래스라고 생각하는 것이 맞습니까?버튼을 누를 때 자바가 다시 칠해짐

GameBoard.java

public class GameBoard extends Panel { 

static Compass compass = new Compass(); 
private static final long serialVersionUID = 1; 
Graphics2D g2d; 

static final Dimension WINDOW_SIZE = new Dimension(1150, 800); 

public void boardMaker() throws Exception { 
    JFrame frame = new JFrame("Display image"); 

    JPanel panel = new JPanel(); 
    /* unimportant stuff 

    ..... 


    */ 

    // 

    DieRoll roll = new DieRoll("Roll Dies"); 
    roll.setC(compass); 
    roll.setG2D(g2d); 
    // 
    Button button = new Button("new"); 
    button.setGameBoard(this); 
    JPanel buttonPanel = new JPanel(); 
    buttonPanel.add(button); 
    buttonPanel.add(roll); 
    buttonPanel.setPreferredSize(new Dimension(200,100)); 

    frame.getContentPane().add(buttonPanel, BorderLayout.NORTH); 
    // 
    frame.getContentPane().add(panel); 
    frame.setVisible(true); 
} 

public void paint(Graphics g) { 
// not important I think 
} 
} 

Button.java

public class Button extends JButton implements ActionListener { 
private static final long serialVersionUID = 1L; 
JPanel panel = new JPanel(); 
JFrame frame = new JFrame(); 
Compass c = new Compass(); 

GameBoard gb = new GameBoard(); 


Button(String text) { 
    this.setText(text); 
    this.addActionListener(this); 
} 

void setGameBoard(GameBoard gb) { 
    this.gb = gb; 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    gb.g2d.setColor(Color.black); 
    gb.g2d.fillRect(100, 100, 100, 200); 
    gb.repaint(); 
} 
} 

이 널 포인터 예외를 제공합니다. 그래서 내 GameBoard를 다시 칠하는 방법은 어떤 생각입니까? 어리 석음 때문에 모든 것을 다시 써야한다면 나는 화가 난 것이 아닙니다! ;)

감사합니다.

+0

패널에 paintComponent 메소드가 없습니다. – ControlAltDel

답변

2

Java 그리는 방법에 대한 잘못된 생각이 있습니다. 패널과 같은 구성 요소가 자체적으로 그려지며 모든 그리기는 UI 스레드에서 수행됩니다. 이 튜토리얼 밖으로

확인 : docs.oracle.com/javase/tutorial/2d/index.html

+0

감사합니다. 내가 튜토리얼을 통해 내 길을 갈거야. – swit

+0

+1 시간을 잘 보냈다. 더 [여기] (http://stackoverflow.com/a/10094267/230513). – trashgod

2

기사 Painting in AWT and Swing 응용 프로그램 트리거 그림에 대한 몇 가지 관점을 제공 할 수 있습니다. 아래 예제는 원리를 설명합니다. 전경색이 bound property이기 때문에 은 repaint()이라고 자동으로 호출하지만 항상 사용자가 직접 호출 할 수 있습니다.

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

public class SwingPaint { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame f = new JFrame(); 
       final GamePanel gp = new GamePanel(); 
       f.add(gp); 
       f.add(new JButton(new AbstractAction("Update") { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         gp.update(); 
        } 
       }), BorderLayout.SOUTH); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.pack(); 
       f.setLocationRelativeTo(null); 
       f.setVisible(true); 
      } 
     }); 
    } 

    private static class GamePanel extends JPanel { 

     private static final Random r = new Random(); 

     public GamePanel() { 
      this.setForeground(new Color(r.nextInt())); 
     } 

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

     public void update() { 
      this.setForeground(new Color(r.nextInt())); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Dimension size = this.getSize(); 
      int d = Math.min(size.width, size.height) - 10; 
      int x = (size.width - d)/2; 
      int y = (size.height - d)/2; 
      g.fillOval(x, y, d, d); 
      g.setColor(Color.blue); 
      g.drawOval(x, y, d, d); 
     } 
    } 
} 
관련 문제