gpt4 book ai didi

java - JFrame 自定义组件未显示

转载 作者:行者123 更新时间:2023-12-01 21:42:13 25 4
gpt4 key购买 nike

我的 TicTacToe 游戏有问题。我制作了 2 个自定义组件,一个用于井字游戏板,另一个用于统计数据。面板显示,但统计数据保持隐藏......为什么?

主要方法:

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();
}

}

最佳答案

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. 如何使用 BorderLayout
  2. 执行自定义绘画

本教程包含所有 Swing 基础知识的工作示例。首先下载这些演示程序。

关于java - JFrame 自定义组件未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36317253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com