以下是我的两个代码示例:
public class Display extends JPanel
{
protected BufferedImage buffer;
private static final long serialVersionUID = 1L;
public Display()
{
super();
//setBackground(Color.BLACK);
buffer = new BufferedImage(PONG_WIDTH, PONG_WIDTH, BufferedImage.TYPE_INT_RGB);
}
protected void paintComponent(Graphics2D g)
{
super.paintComponent(g);
g.drawImage(buffer, 0, 0, this);
}
}
和
public class Server extends Display
{
private static final long serialVersionUID = 1L;
public Server() throws IOException
{
super();
Graphics2D g = buffer.createGraphics();
g.setBackground(Color.BLACK);
g.setColor(Color.WHITE);
g.fillRect(0, (PONG_HEIGHT-RACKET_HEIGHT)/2, RACKET_WIDTH, RACKET_HEIGHT);
repaint();
编辑:添加main
方法:
public class Test {
public static void main(String args[])
{
JFrame f = new JFrame();
f.setTitle("Test2");
f.setSize(1000, 1000);
f.setLocationRelativeTo(null);
try{
Server s = new Server();
f.add(s); //or f.setContentPane(s);
s.repaint();
f.setVisible(true);
s.play();
}
catch (IOException e){}
}
}
当我在子类中绘制多个形状时,如果我取消注释Display
的构造函数的第二行,为什么面板显示为空白或黑色?我一直试图找出答案,但我的每一次尝试都没有达成。
答案 0 :(得分:2)
组件层次结构中没有这样的方法protected void paintComponent(Graphics2D g)
,实际应该是protected void paintComponent(Graphics g)
< - 注意方法的形式参数要求
一旦完成,您应该在Graphics#dispose
创建的Graphics
上下文中调用BufferedImage
,这可能会阻止某些平台正确呈现图像(以及防止程序消耗系统资源。)
您应该仅在EDT的上下文中创建和修改UI的状态,有关详细信息,请参阅Initial Threads。
还需要有理由直接从JFrame
扩展,除了在您的代码中引入混淆之外,您实际上并没有在课程中添加任何功能。