JFrame不显示输出?

时间:2012-10-05 01:38:40

标签: java arrays class methods awt

我是Java的新手,整个使用数组+使用类及其方法来填充和显示数组。我花了最后2-3个小时,正在研究这个并检查谷歌的各种答案,似乎没有任何帮助,我仍然卡住了。在使用数组时,我真的不知道如何使用rectangle1类中的方法。

主要课程:

public static void main(String[] args) {
    GameBoard frame = new GameBoard();
}

GameBoard Class

public class GameBoard extends JFrame {

    public GameBoard() {

        JFrame frame = new JFrame();
        frame.setBounds(0, 0, 195, 215);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Rectangle1 board[][] = new Rectangle1[3][3];
        for (int row = 0; row < board.length; row++) {
            for (int col = 0; col < board[row].length; col++) {
                board[row][col] = new Rectangle1(0, 0, 195, 215);
                if ((row + col) % 2 == 0) {
                    Graphics g = null;    
                    board[row][col].paint(g);
                    g.setColor(Color.yellow);
                    g.fillRect(0, 0, 195, 215);
                } else {
                    Graphics h = null;
                    board[row][col].paint(h);
                    h.setColor(Color.red);
                    h.fillRect(0, 0, 195, 215);
                }
                frame.add(board[row][col]);
            }    
        }  

    }
}

Rectangle1类。

public class Rectangle1 extends JComponent  {

    /** post:   getX() == x  and  getY() == y
     *          and  getWidth() == w  and getHeight() == h
     *          and  getBackground() == Color.black
     */
    public Rectangle1(int x, int y, int w, int h)  {
        super();
        setBounds(x, y, w, h);
        setBackground(Color.black);
    }

    /** post:   this method draws a filled Rectangle
     *          and  the upper left corner is (getX(), getY()) 
     *          and  the rectangle's dimensions are getWidth() and getHeight()
     *          and  the rectangle's color is getBackground()
     */
    public void paint(Graphics g)  {
        g.setColor( getBackground() );
        g.fillRect(0, 0, getWidth()-1, getHeight()-1);
        paintChildren(g);
   }

}

4 个答案:

答案 0 :(得分:1)

首先,您正在与布局管理器进行斗争,在您setBounds(x, y, w, h)类中调用类似Rectangle的内容将被父容器的布局管理器覆盖(在本例中为框架)

其次,你不负责绘画,这样做;

board[row][col].paint(g);
g.setColor(Color.yellow);
g.fillRect(0, 0, 195, 215);

......错了。如果它没有结束你的编程崩溃,那么你的幸运。

当我尝试找出解决方案时,您可能需要花些时间阅读

在我的咆哮中......

此;     public void paint(Graphics g){         g.setColor(getBackground());         g.fillRect(0,0,getWidth() - 1,getHeight() - 1);         paintChildren(克);     }

不合适。你必须打电话给super.paint(),你需要在后台进行大量工作,以便在不调用super的情况下覆盖此方法。

事实上,您应该尽可能避免覆盖paint而代之以用户paintComponent

此外,Swing中的坐标是相对于组件的。也就是说,任何组件的顶部/左角(在组件的上下文中)始终为0x0

这是一个有效的例子

public class TestBoard {

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

    public TestBoard() {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {

                new GameBoard();

            }
        });

    }

    public class GameBoard extends JFrame {

        public GameBoard() {

            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;

            Rectangle1 board[][] = new Rectangle1[3][3];
            for (int row = 0; row < board.length; row++) {

                gbc.gridx = 0;

                for (int col = 0; col < board[row].length; col++) {
                    board[row][col] = new Rectangle1(195, 215);
                    if ((row + col) % 2 == 0) {
                        board[row][col].setBackground(Color.YELLOW);
                    } else {
                        board[row][col].setBackground(Color.RED);
                    }
                    frame.add(board[row][col], gbc);
                    gbc.gridx++;
                }

                gbc.gridy++;

            }

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

        }
    }

    public class Rectangle1 extends JPanel {

        public Rectangle1(int w, int h) {
            setPreferredSize(new Dimension(w, h));
        }

    }
}

由于您的要求的性质,我被迫使用GridBagLayout,这不是最简单的布局管理器。

JComponents本质上是透明的,您需要填写它们,最好使用JPanel

答案 1 :(得分:1)

评论:

  1. GameBoard扩展了JFrame,但随后您在JFrame构造函数中创建了一个GameBoard实例。你应该做其中一个,但不能两个都做。

  2. Rectangle.paint()应该是Rectangle.paintComponent()。现在,您只需创建Rectangle对象并将其添加到容器中,例如JFrameJPanel。它们将自动绘制。如果您要延长paint(),则无需明确致电paintComponent()JComponent

答案 2 :(得分:0)

您正在使用null Graphics对象绘制窗口。而不是使用

Graphics g = null; Graphics h = null;

使用

Graphics g = getGraphics(); Graphics h = getGraphics();

很可能这会给你一个NullPointerException不是吗?

由于您的矩形继承自JComponent,因此您不应该自己调用paint()方法。而是在将所有这些内容添加到框架后调用repaint()

答案 3 :(得分:0)

这是你的问题:

Graphics g = null;
board[row][col].paint(g);

使用null Graphics调用paint()会导致NullPointerException

public void paint(Graphics g)  {
        g.setColor( getBackground() );
        g.fillRect(0, 0, getWidth()-1, getHeight()-1);
        paintChildren(g);
}