使用paintComponent()绘制多个图像

时间:2013-04-26 16:55:57

标签: java image swing draw

我想在同一JPanel的屏幕上显示多个图片。

for循环迭代数组中的每个元素并显示其对应的图像,但似乎只保留最后一个图像。

代码:

import javax.swing.*;
import java.awt.*;
import java.io.*;
import javax.imageio.ImageIO;

public class GameGUI extends JFrame{
JPanel mainPanel = new JPanel();
JPanel buttonPanel = new JPanel();
int arrayLength;

public GameGUI() {
    super("Gameplay");

    //Set size of the frame.
    setSize(650, 580);
    //Location inside frame.
    setLocation(10, 8);

    SwingUtilities.isEventDispatchThread();

包含每个小组的方法:

    createMainPanel();
    createCentrePanel();
    createNorthPanel();
    createSouthPanel();
    createWestPanel();
    createEastPanel();
    setVisible(true);

}
//creating panels

public void createMainPanel() {
    //here is the main panel which the others will be nested in.
    mainPanel.setLayout(new BorderLayout());
    mainPanel.setBackground(Color.red);
    add(mainPanel);
}

public boolean createCentrePanel() {
    JPanel CENTRE = new JPanel(new BorderLayout());
    CENTRE.setBackground(Color.WHITE);
    CENTRE.setBorder(BorderFactory.createLineBorder(Color.black));
    mainPanel.add(CENTRE, BorderLayout.CENTER);

    return true;
}

这是我用来将多个图像打印到面板的面板。 正如您所看到的,我有一个for循环,它遍历数组中的每个项目并将值传递给draw组件。然而,它似乎只是将最后一个图像保留在屏幕上,尽管数组中的每个项目都被传递给它。

我尝试使用repaint,但似乎无效:

public boolean createNorthPanel() {
    int[] array = {1, 8, 9, 10};
    arrayLength = array.length;
    int size = 0;
    JPanel NORTH = new JPanel(new BorderLayout());
    NORTH.setPreferredSize(new Dimension(100, 100));
    NORTH.setBorder(BorderFactory.createLineBorder(Color.black));
    mainPanel.add(NORTH, BorderLayout.NORTH);
    for (int i = 0; i < arrayLength; i++) {
        NORTH.add(new drawPanel(array[i], size, arrayLength));
        size = size + 30;
        //repaint();
    }
    return true;
}

public boolean createSouthPanel() {
    JPanel SOUTH = new JPanel(new BorderLayout());
    SOUTH.setPreferredSize(new Dimension(100, 100));
    // SOUTH.add(new drawPanel(2, 0));
    // SOUTH.add(new drawPanel(5, 30));
    SOUTH.setBorder(BorderFactory.createLineBorder(Color.black));
    mainPanel.add(SOUTH, BorderLayout.SOUTH);
    SOUTH.add(buttonPanel, BorderLayout.EAST);

    return true;
}

public boolean createWestPanel() {
    JPanel WEST = new JPanel(new BorderLayout());
    WEST.setPreferredSize(new Dimension(150, 100));
    //WEST.add(new drawPanel(8, 0));
    WEST.setBorder(BorderFactory.createLineBorder(Color.black));
    mainPanel.add(WEST, BorderLayout.WEST);

    return true;
}

public boolean createEastPanel() {
    JPanel EAST = new JPanel(new BorderLayout());
    EAST.setPreferredSize(new Dimension(150, 100));
    EAST.setBorder(BorderFactory.createLineBorder(Color.black));
    mainPanel.add(EAST, BorderLayout.EAST);
    //EAST.add(new drawPanel(2, 0));
    //EAST.add(new drawPanel(7, 60));

    return true;
}

public static void main(String args[]){
    new GameGUI();
}
}

这是我的课程,它在屏幕上绘制图像

class drawPanel extends JPanel {

Image image = null;
int xPos;

public drawPanel(int x, int y, int length) {

    xPos = y;
    try {
        File location = new File("src/Card_images/" + x + ".png");
        image = ImageIO.read(location);

    } catch (IOException e) {
        System.out.println("Error: " + e);
    }
}

/*public Dimension getPreferredSize() {
 return new Dimension(71, 96);
 }*/
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    //draws image to screen at positions displayed
    g.drawImage(image, xPos, 0, this);
}
}

1 个答案:

答案 0 :(得分:2)

您只有一个drawImage()语句在paintCompent()方法中执行,因此您只能看到最后绘制的图像。

有关绘制多个对象的两种不同方法,请参阅Custom Painting Approaches。您显然需要根据您的要求进行定制,但基本概念将是相同的。

编辑:

以上内容不适用于您的问题,但您仍需要知道何时需要进行自定义绘画。

抱歉,由于自定义绘画,我误解了你的问题。你使代码太复杂了。

第一个问题是您将“北”面板的布局管理器更改为BorderLayout。您只能将单个组件添加到BorderLayout的任何位置。这就是为什么添加的最后一个组件被绘制的原因。只需使用面板的默认FlowLayout。虽然您的代码仍无效,因为您的组件没有首选大小。

所以问题的解决方案是:

a)使用FlowLayout创建一个面板 b)使用JLabel显示图像。没有必要做自定义绘画!将标签添加到面板,然后将此面板添加到您的框架中。

现在,布局管理器可以完成其工作,您无需担心细节。

此外,使用标准Java命名约定。您的代码太难阅读,因为您没有遵循标准。

  • NORTH不是一个合适的变量名。应该是“北方”。上面的外壳名称表示最终的静态变量。

  • 使用正确的类名。类应以大写字符开头。 “drawPanel”应为“DrawPanel”。