为什么我的图像不显示在我的面板中?

Why do my images not display in my panels?

我想为我的游戏设置背景。

场景: 首先,我必须从一个文本文件中读取,然后根据该文本在其上绘制我的瓷砖地图和图像。其次,我的地图是 3600*2400 像素,它比我的屏幕大,所以我必须滚动它。第三,我屏幕的一角必须有一张迷你地图,告诉我我在哪里。 (我想我应该使用面板和 awt.container。)

这是我的代码:

   public class bkg extends Panel implements ImageObserver {
//i Initialize my variables here
// then read my images with image buffer in constructor
public static void main(String[] args) {
    //my three panels and frame settings
    Frame frame = new Frame();
    frame.setLayout(null);
    frame.setSize(1350, 700);
    frame.setTitle("age of empires");
    frame.setVisible(true);
    frame.setLayout(null);
    Panel p1 = new Panel();
    Panel p2 = new Panel();
    p2.setLayout(null);
    JPanel p3 = new JPanel();
    p3.setLayout(null);
    p1.setSize(1350, 700); // i divide my screen in to 3 parts , one biggest panel, and two small. the biggest one is for main map
    p1.setLayout(null);
    p2.setBackground(Color.cyan);//just wanna test showing my panel.
    p2.setSize(675, 350);
    p3.setSize(675, 350);
    p1.setLocation(0, 0);
    p2.setLocation(0, 350);// this small panel must be under the main pannel.
    p3.setLocation(675, 350);// this is with p2.
    frame.add(p1);
    p1.add(p2);
    p2.add(p3);
    tilemap = new int[60][75];// it creat my tilemap in console.
    filereader();// it reads the text file.

}
@Override
public  void paint(Graphics g) {
    super.paint(g);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            int mod_i = 100 * i;// based on images sizes
            int mod_j = 50 * j;// based on images sizes
            //now i start to draw images base on the text file numbers
            switch (tilemap[i][j]) {
            case 1:
                g.drawImage(tree, mod_i, mod_j, null);
                break;
            .........

            }
        }
    }

}

问题:好像我的代码连paint方法都看不到。它不会在我的面板上绘制任何图像。有什么问题?

你的代码错误太多,我从头开始创建一个分为 3 个区域的 GUI。

  1. 您必须通过调用 SwingUtilities invokeLater 方法来启动 Swing 应用程序。这确保 Swing 应用程序在 Event Dispatch thread (EDT).

    上启动
  2. A Java class 名称以大写字母开头。 Java 方法名和变量名以小写字母开头。

  3. 不要将所有内容都放在 main 方法中。将您的代码分解为可以很好地完成一件事的方法。我的 运行 方法创建了 JFrame。我的 createMainPanel 方法创建主面板。

  4. 我使用 Swing layout managers 来定位 JPanel。是的,使用绝对定位似乎更容易,但是您不能将您的应用程序移动到具有不同屏幕分辨率的任何其他计算机上。

我决定就此打住。您将创建更多方法和/或 classes 来进一步定义 3 个 JPanel。在那些 JPanel 方法/classes 中,您将覆盖 paintComponent 方法,而不是 paint 方法。

这是代码。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class AgeOfEmpires implements Runnable {

    private JFrame frame;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new AgeOfEmpires());
    }

    @Override
    public void run() {
        frame = new JFrame();
        frame.setTitle("Age of Empires");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createMainPanel());

        frame.pack();
        frame.setVisible(true);
    }

    private JPanel createMainPanel() {
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());

        JPanel upperPanel = new JPanel();
        upperPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));

        JPanel tilePanel = new JPanel();
        tilePanel.setBackground(Color.CYAN);
        tilePanel.setPreferredSize(new Dimension(800, 300));

        upperPanel.add(tilePanel);

        JPanel lowerPanel = new JPanel();
        lowerPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));

        JPanel miniMapPanel = new JPanel();
        miniMapPanel.setBackground(Color.BLUE);
        miniMapPanel.setPreferredSize(new Dimension(400, 300));

        JPanel unknownPanel = new JPanel();
        unknownPanel.setBackground(Color.GREEN);
        unknownPanel.setPreferredSize(new Dimension(400, 300));

        lowerPanel.add(miniMapPanel);
        lowerPanel.add(unknownPanel);

        mainPanel.add(upperPanel, BorderLayout.CENTER);
        mainPanel.add(lowerPanel, BorderLayout.SOUTH);

        return mainPanel;
    }

}