JFrame自定义组件未显示

时间:2016-03-30 18:47:40

标签: java swing jframe

我的TicTacToe游戏有问题。我制作了2个自定义组件,一个用于tictactoe板,另一个用于统计。董事会出现但统计数据仍然隐藏......为什么?

主要方法:

public Game() {
    player1 = new Player("Tester1", PieceType.Cross, Color.RED);
    player2 = new Player("Tester2", PieceType.Circle, Color.BLUE);
    currentPlayer = random.nextInt(2);

    board = new TicTacToeBoard(125, 125, 3, 3);
    stats = new Stats(375, 0, 376, 125);

    setTitle("Tic Tac Toe");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setPreferredSize(size);
    setMaximumSize(size);
    setMinimumSize(size);
    setResizable(false);
    setLocationRelativeTo(null);
    add(board);
    add(stats);
    pack();
    setVisible(true);
}

统计类(必要部分):

    /**
 * @param x
 * @param y
 * @param width
 * @param height
 */
public Stats(int x, int y, int width, int height) {
    setPreferredSize(new Dimension(width, height));
    setBounds(x, y, width, height);
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
}

@Override
public void paint(Graphics g) {
    g.setColor(Color.BLACK);
    g.fillRect(x, y, width - 1, height - 1);
}

该代码应绘制2个框,对吧?它只绘制了绿色的...... 最简单,完整和可验证的例子:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class test {

    public test() {
        JFrame frame = new JFrame();
        frame.setTitle("Test");
        frame.setPreferredSize(new Dimension(200, 300));
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);

        frame.add(new a(), BorderLayout.CENTER);
        frame.add(new b(), BorderLayout.PAGE_END);  

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

    class a extends JPanel {

        private static final long serialVersionUID = 1L;

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.GREEN);
            g.fillRect(0, 0, 200, 100);
        }

    }

    class b extends JPanel {

        private static final long serialVersionUID = 1L;

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLUE);
            g.fillRect(0, 100, 200, 100);
        }

    }

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

}

1 个答案:

答案 0 :(得分:3)

add(board);
add(stats);

JFrame的默认布局是BorderLayout。您没有在BorderLayout中指定组件的位置,因此它默认为CENTER。但是,您只能在CENTER中拥有一个组件。

尝试:

add(board, BorderLayout.CENTER);
add(stats, BorderLayout.PAGE_END);

自定义绘制是通过覆盖paintComponent(...)方法而不是paint()方法完成的。并且您需要调用super.paintComponent(...)作为第一个语句。

进行自定义绘制时,还需要覆盖getPreferredSize()方法,以便布局管理器可以正常工作。否则,组件的大小将为(0,0),因此无需绘制任何内容。

将此链接保存到Swing Tutorial

您可以找到以下部分:

  1. How to Use BorderLayout
  2. Performing Custom Painting
  3. 本教程提供了所有Swing基础知识的工作示例。首先下载这些演示程序。