我想在同一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);
}
}
答案 0 :(得分:2)
您只有一个drawImage()语句在paintCompent()方法中执行,因此您只能看到最后绘制的图像。
有关绘制多个对象的两种不同方法,请参阅Custom Painting Approaches。您显然需要根据您的要求进行定制,但基本概念将是相同的。
编辑:
以上内容不适用于您的问题,但您仍需要知道何时需要进行自定义绘画。
抱歉,由于自定义绘画,我误解了你的问题。你使代码太复杂了。
第一个问题是您将“北”面板的布局管理器更改为BorderLayout。您只能将单个组件添加到BorderLayout的任何位置。这就是为什么添加的最后一个组件被绘制的原因。只需使用面板的默认FlowLayout。虽然您的代码仍无效,因为您的组件没有首选大小。
所以问题的解决方案是:
a)使用FlowLayout创建一个面板 b)使用JLabel显示图像。没有必要做自定义绘画!将标签添加到面板,然后将此面板添加到您的框架中。
现在,布局管理器可以完成其工作,您无需担心细节。
此外,使用标准Java命名约定。您的代码太难阅读,因为您没有遵循标准。
NORTH不是一个合适的变量名。应该是“北方”。上面的外壳名称表示最终的静态变量。
使用正确的类名。类应以大写字符开头。 “drawPanel”应为“DrawPanel”。