重新绘制()-组件没有'不要为了一场简单的演出而出现



我正在尝试编写一个Othello,并且。。。我已经陷入了一种基本观点。

我的主要课程:

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网格并设置它们的图标。

相关内容

  • 没有找到相关文章

最新更新