0

ボタンを押してボードを更新しようとして、(脳内で) 壁にぶつかりました。GameBoard クラスが repaint()ed される必要があると考えるのは正しいですか?

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
}
}

ボタン.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();
}
}

これにより、null ポインター例外が発生します。では、私のゲームボードを再描画する方法はありますか? 愚かさのためにすべてを書き直さなければならない場合でも、私は怒っていません! ;)

ありがとう

4

2 に答える 2

2

Java での描画方法について、あなたは間違った考えを持っています。パネルなどのコンポーネントはそれ自体を描画し、すべての描画は UI スレッドで行われます。

このチュートリアルをチェックしてください: docs.oracle.com/javase/tutorial/2d/index.html

于 2012-04-10T14:59:07.077 に答える
2

AWT と Swing でのペイントに関する記事では、アプリケーションによってトリガーされるペイントについて、いくつかの視点が提供されている可能性があります。以下の例は、原理を示しています。前景色はバインドされたプロパティsetForeground()であるため、自動的に呼び出されますが、いつでも自分で呼び出すことができます。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);
        }
    }
}
于 2012-04-10T18:21:51.053 に答える