Swing只画了两个JPanels中的一个?

时间:2014-04-10 10:01:18

标签: java swing jframe jpanel

我正在用Java构建一个用于实习的显示API。在单个图像中加载有效,但只要我想添加另一个图像,第一个图像就会消失,只会绘制第二个图像。有想法该怎么解决这个吗?

主要班级:

package com.lespaul.display;

import java.awt.Graphics;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class Window extends JFrame {
    private static final long serialVersionUID = 3716315131567381715L;

    public Window() {
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setSize(200, 200);
        this.setVisible(true);
        Image pane = new Image("floor.png");
        Image pane2 = new Image("floor.png");
        this.add(pane);
        this.add(pane2);
        pane2.setPosition(50,50);
        this.revalidate();

    }

    public static void main(String[] args){
        Window window = new Window();
    }
}

这是实际的形象......

package com.lespaul.display;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

import java.awt.image.BufferedImage;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.io.IOException;
import java.net.URL;

import com.lespaul.position.*;

public class Image extends JPanel {
    private static final long serialVersionUID = -5815516814733234713L;
    public BufferedImage image;
    public Vector2 position = new Vector2(0, 0);

    public Image() {

    }
    public Image(String ref){
        try {
            this.addImage(ref);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public void setPosition(int x, int y){
        Dimension size = this.getPreferredSize();
        Insets insets = this.getInsets();
        this.setBounds(x+insets.left,y+insets.top,size.width,size.height);
        this.position.x = x;
        this.position.y = y;
        repaint();
    }
    public void addImage(String fileName) throws IOException {
        URL url = this.getClass().getClassLoader().getResource(fileName);
        image = ImageIO.read(url);

    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (image != null)
            g.drawImage(image,(int)position.x,(int)position.y, null);
    }
}    

3 个答案:

答案 0 :(得分:2)

不要给你的班级打电话。该名称有一个Java接口,使您的代码混乱。

如果要在不同位置绘制多个图像,则常见的解决方案是跟踪ArrayList中的图像,然后创建一个循环通过ArrayList的自定义组件,以在指定位置绘制图像。

查看Custom Painting Approaches以获取示例。 DrawOnComponent示例将让您了解如何实现此方法。

答案 1 :(得分:0)

使用任何布局,例如

    jFrame.getContentPane().add(jPanel1,BorderLayout.NORTH);
    jFrame.getContentPane().add(jPanel2,BorderLayout.SOUTH);

答案 2 :(得分:-1)

最佳做法是使用layouts来管理组件位置。

祝你好运!