gpt4 book ai didi

java - 为什么 PaintComponents 被调用但看不到?

转载 作者:行者123 更新时间:2023-12-02 01:43:52 24 4
gpt4 key购买 nike

我有一个单元格网格布局,每个单元格都扩展了 JComponent。GridLayout 管理扩展 JPanel 的 Board 类,并且 Board 对象/面板与其他两个面板一起添加到主面板中。

这是细胞类别:

public class Cell extends JComponent{

private int row;
private int col;

private int rowHeight;
private int colWidth;

private boolean active = false;

private Color color;

public Cell(int row, int col, Color color) {
this.row = row;
this.col = col;

this.color = color;
}

public Cell(int row, int col, int rowHeight, int colWidth, Color color) {
this.row = row;
this.col = col;

this.rowHeight = rowHeight;
this.colWidth = colWidth;

this.color = color;
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);

paintSquare(g);
}

private void paintSquare(Graphics g) {
g.setColor(color);
g.fillRoundRect(
(int) (col * colWidth),
(int) (row * rowHeight),
(int) (rowHeight),
(int) (colWidth),
10,
10);

}

public int getCol()
{
return col;
}

public int getRow()
{
return row;
}

public boolean isActive() {
return active;
}

public void setActive(boolean active) {
this.active = active;
}

public Color getColor() {
return color;
}

public void setColor(Color color) {
this.color = color;
}
}

这是董事会类:

public class Board extends JPanel {

public Cell[][] gameBoard;

public final int GAME_ROWS;
public final int GAME_COLUMNS;

public int rowHeight;
public int columnWidth;

public Color selectedColor;

public Board(int GAME_ROWS, int GAME_COLUMNS) {
this.GAME_COLUMNS = GAME_COLUMNS;
this.GAME_ROWS = GAME_ROWS;

calculateDimensions();

createGameBoard();

setUpBoardPanel();
}

private void calculateDimensions() {
rowHeight = (int) this.getHeight() / GAME_ROWS;
columnWidth = (int) this.getWidth() / GAME_COLUMNS;
}

private void createGameBoard() {
Random random = new Random();
int cellColor;
gameBoard = new Cell[GAME_ROWS][GAME_COLUMNS];
for (int row = 0; row < GAME_ROWS; row++) {
for (int col = 0; col < GAME_COLUMNS; col++) {
cellColor = random.nextInt(Properties.COLORS.length);
Cell newCell = new Cell(row, col, rowHeight,
columnWidth,Properties.COLORS[cellColor]);
gameBoard[row][col] = newCell;
}
}
}

private void setUpBoardPanel() {
setLayout(new GridLayout(GAME_ROWS, GAME_COLUMNS));
setPreferredSize(Properties.BOARD_TABLE_SIZE);
setBorder(new EmptyBorder(20, 10, 0, 0));
setBackground(Properties.BACKGROUND_COLOR);

addBoardPanelComponents();
}

private void addBoardPanelComponents() {
for(int r = 0; r < GAME_ROWS; r++) {
for(int c = 0; c < GAME_COLUMNS; c++) {
add(gameBoard[r][c]);
}
}
}
}

主面板上的所有内容都完美显示,我可以看到添加了 Board 面板,因为当我更改其背景时,它会按设置显示。

我已经浏览了一堆教程并且调用 super 正确,所以我不确定如何正确添加和调用组件但不显示。

要查看完整的程序代码,您可以访问我的 github ,但相关代码在上面。 TIA!

最佳答案

“核心”问题是,你不了解码件的坐标空间是如何工作的。

组件的x/y位置是相对于其父级的。任何组件/容器的左上角/左上角始终为0x0

所以当你做这样的事情时......

g.fillRoundRect(
(int) (col * colWidth),
(int) (row * rowHeight),
(int) (rowHeight),
(int) (colWidth),
10,
10);

你的意思是,填充一个从 col * width x row * rowHeight 开始的矩形,相对于组件本身的左上角(总是 0x0)

你应该做的事情更像是这样......

g.fillRoundRect(
0,
0,
getWidth() - 1,
getHeight() - 1,
10,
10);

这将填充组件的整个可见区域。

但是为什么要使用getWidthgetHeight。好吧,在这种情况下,这确保了组件的整个可见区域被填充,但是如何影响组件的大小呢?

首选方法是重写组件的 getPreferredSize 方法并返回“首选”大小(所有条件都相同)。

@Override
public Dimension getPreferredSize() {
return new Dimension(colWidth, rowHeight);
}

这向父布局管理器提供了有关组件“希望”如何布局的提示。

另一个问题是...

    private void calculateDimensions() {
rowHeight = (int) this.getHeight() / GAME_ROWS;
columnWidth = (int) this.getWidth() / GAME_COLUMNS;
}

这是没有意义的,因为在组件经过布局传递之前,它的大小是0x0,所以,基本上你说的是rowHeightcolumnWidth 应该是 0x0 :/

老实说,最好还是摆脱它。如果需要,直接将已知值播种到Cell

可运行示例...

Blobs

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.util.Random;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

public class Test {

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

public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Board(10, 10));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class Board extends JPanel {

public Cell[][] gameBoard;

public final int GAME_ROWS;
public final int GAME_COLUMNS;

public int rowHeight = 50;
public int columnWidth = 50;

public Color selectedColor;

public Board(int GAME_ROWS, int GAME_COLUMNS) {
this.GAME_COLUMNS = GAME_COLUMNS;
this.GAME_ROWS = GAME_ROWS;

createGameBoard();

setUpBoardPanel();
}

private void createGameBoard() {
Random random = new Random();
int cellColor;
Color[] colors = new Color[]{Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.RED, Color.YELLOW};
gameBoard = new Cell[GAME_ROWS][GAME_COLUMNS];
for (int row = 0; row < GAME_ROWS; row++) {
for (int col = 0; col < GAME_COLUMNS; col++) {
cellColor = random.nextInt(colors.length);
Cell newCell = new Cell(row, col, rowHeight,
columnWidth, colors[cellColor]);
gameBoard[row][col] = newCell;
}
}
}

private void setUpBoardPanel() {
setLayout(new GridLayout(GAME_ROWS, GAME_COLUMNS));
setBorder(new EmptyBorder(20, 10, 0, 0));
setBackground(Color.RED);

addBoardPanelComponents();
}

private void addBoardPanelComponents() {
for (int r = 0; r < GAME_ROWS; r++) {
for (int c = 0; c < GAME_COLUMNS; c++) {
add(gameBoard[r][c]);
}
}
}
}

public class Cell extends JComponent {

private int row;
private int col;

private int rowHeight;
private int colWidth;

private boolean active = false;

private Color color;

public Cell(int row, int col, int rowHeight, int colWidth, Color color) {
this.row = row;
this.col = col;

this.rowHeight = rowHeight;
this.colWidth = colWidth;

this.color = color;
setBorder(new LineBorder(Color.BLACK));
}

@Override
public Dimension getPreferredSize() {
return new Dimension(colWidth, rowHeight);
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);

paintSquare(g);
}

private void paintSquare(Graphics g) {
g.setColor(color);
g.fillRoundRect(
0,
0,
getWidth() - 1,
getHeight() - 1,
10,
10);

}

public int getCol() {
return col;
}

public int getRow() {
return row;
}

public boolean isActive() {
return active;
}

public void setActive(boolean active) {
this.active = active;
}

public Color getColor() {
return color;
}

public void setColor(Color color) {
this.color = color;
}
}

}

关于java - 为什么 PaintComponents 被调用但看不到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53992610/

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