0

我想在同一屏幕上显示多个图像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 循环,它遍历数组中的每个项目并将值传递给绘图组件。然而,即使数组中的每个项目都被传递给它,它似乎只保留屏幕上的最后一个图像。

我尝试过使用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);
}
}
4

1 回答 1

2

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

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

编辑:

以上不适用于您的问题,但仍然很高兴知道您何时需要进行一些自定义绘画。

抱歉,由于自定义绘画,我误读了您的问题。您使代码过于复杂。

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

因此,您的问题的解决方案是:

a) 使用 FlowLayout 创建一个面板 b) 使用 JLabel 来显示您的图像。无需进行自定义绘画!将标签添加到面板,然后将此面板添加到框架中。

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

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

  • NORTH 不是正确的变量名。应该是“北”。大写名称表示最终的静态变量。

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

于 2013-04-26T17:50:00.600 回答