图像未显示在JPanel中

时间:2015-11-09 22:08:04

标签: java image swing jpanel

以下是我的两个代码示例:

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的构造函数的第二行,为什么面板显示为空白或黑色?我一直试图找出答案,但我的每一次尝试都没有达成。

1 个答案:

答案 0 :(得分:2)

组件层次结构中没有这样的方法protected void paintComponent(Graphics2D g),实际应该是protected void paintComponent(Graphics g)< - 注意方法的形式参数要求

一旦完成,您应该在Graphics#dispose创建的Graphics上下文中调用BufferedImage,这可能会阻止某些平台正确呈现图像(以及防止程序消耗系统资源。)

您应该仅在EDT的上下文中创建和修改UI的状态,有关详细信息,请参阅Initial Threads

还需要有理由直接从JFrame扩展,除了在您的代码中引入混淆之外,您实际上并没有在课程中添加任何功能。