gpt4 book ai didi

java - repaint() - 组件不会出现在简单的展示中

转载 作者:行者123 更新时间:2023-11-29 04:14:46 24 4
gpt4 key购买 nike

我正在尝试编写黑白棋,并且...我已经被基本 View 所困。

我的主课:

public class Othello extends JFrame {
private static final long serialVersionUID = 1L;

public static final int WIDTH = 800;
public static final int HEIGHT = 600;

private Grid grid;

public Othello() {
this.setSize(WIDTH, HEIGHT);
this.setTitle("Othello");

this.grid = new Grid();

this.setContentPane(this.grid);

this.grid.revalidate();
this.grid.repaint();
}

public void run() {
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setResizable(false);
this.setVisible(true);
}

public static void main(String[] args) {
new Othello().run();
}
}

还有我的 JPanel 类:

public class Grid extends JPanel {
private static final long serialVersionUID = 1L;

public Grid() {}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);

g.setColor(new Color(0,128,0));
g.fillRect(0, 0, WIDTH, HEIGHT);
}
}

我不明白为什么它不显示任何内容。

调用了 paintComponent,但没有任何反应,我几乎在所有地方都尝试调用 revalidate()repaint() 但没有任何效果。

我一直在寻找不同主题的解决方案近 1 小时,但我找到的解决方案都没有用。

最佳答案

这是你的问题:

g.fillRect(0, 0, WIDTH, HEIGHT);

WIDTH 和 HEIGHT 值不是您期望的值,事实上它们很可能都是 0。为了最安全的编程,您需要通过 getWidth() 获取实际宽度和高度> 和 getHeight()

不需要那些 revalidate()repaint()。例如:

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

import javax.swing.*;

public class GridTest {

private static final int WIDTH = 800;
private static final int HEIGHT = 600;

private static void createAndShowGui() {

Grid mainPanel = new Grid(WIDTH, HEIGHT);

JFrame frame = new JFrame("Grid Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}

class Grid extends JPanel {
private static final long serialVersionUID = 1L;
private int prefW;
private int prefH;


public Grid(int prefW, int prefH) {
this.prefW = prefW;
this.prefH = prefH;
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);

g.setColor(new Color(0,128,0));
g.fillRect(0, 0, getWidth(), getHeight());
}

@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(prefW, prefH);
}

}

此外,如果您所做的只是填充背景,则确实没有必要重写 paintComponent。在 Grid 构造函数中调用 setBackground(new Color(0, 128, 0)); 将设置它。当然,如果您要绘制其他东西,您可能需要 paintComponent——但如果它是一个网格,请考虑使用 JLabel 网格并设置它们的图标。

关于java - repaint() - 组件不会出现在简单的展示中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53092658/

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