【问题标题】:Adding scrollbars and image resizing issues添加滚动条和图像大小调整问题
【发布时间】:2012-02-12 14:49:57
【问题描述】:

好的,对于那些真正看过我的帖子的人来说,我的代码已经发展得很好,现在我可以按照我想要的方式显示我的精灵表了。这是我的代码:

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

public class AnimTest
{
public static void main(String[] args)
{
    AnimTest test = new AnimTest();
    test.go();
}

public void go()
{
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    MyDrawP drawP = new MyDrawP();
    frame.getContentPane().add(drawP);
    frame.setSize(640,640);
    frame.setVisible(true);
    frame.setResizable(true);

}
}

class MyDrawP extends JPanel
{

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    try {

        BufferedImage bigImg = ImageIO.read(new File("C:/Users/scott/Desktop/Personal Work/Pixel Art/terrain.png"));

        final int width = 64;
        final int height = 64;
        final int rows = 5;
        final int cols = 16;
        final int mapX = 10;
        final int mapY = 8;

        BufferedImage[][] sprites = new BufferedImage[cols][rows];

        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                //System.out.println("J is: " + j);
                //System.out.println("I is: " + i);
                //System.out.println("i * width is: " + i * width);
                //System.out.println("j * height is: " + j * height);
                //System.out.println("");

                sprites[j][i] = bigImg.getSubimage(j * width, i * height, width, height);
                //g.drawImage(sprites[j][i], 5, 5, this);
            }
        }
            for (int i = 0; i < mapX; i++)
            {
                for (int j = 0; j < mapY; j++)
                {
                ArrayList<BufferedImage> spriteListRoad = new ArrayList<BufferedImage>();
                BufferedImage road4way = sprites[0][0];
                spriteListRoad.add(road4way);
                BufferedImage roadS = sprites[1][0];
                spriteListRoad.add(roadS);
                BufferedImage roadV = sprites[2][0];
                spriteListRoad.add(roadV);
                BufferedImage roadH = sprites[3][0];
                spriteListRoad.add(roadH);
                BufferedImage roadEndU = sprites[4][0];
                spriteListRoad.add(roadEndU);
                BufferedImage roadEndL = sprites[5][0];
                spriteListRoad.add(roadEndL);
                BufferedImage roadEndR = sprites[6][0];
                spriteListRoad.add(roadEndR);
                BufferedImage roadEndD = sprites[7][0];
                spriteListRoad.add(roadEndD);
                BufferedImage roadLU = sprites[8][0];
                spriteListRoad.add(roadLU);
                BufferedImage roadRU = sprites[9][0];
                spriteListRoad.add(roadRU);
                BufferedImage roadLD = sprites[10][0];
                spriteListRoad.add(roadLD);
                BufferedImage roadRD = sprites[11][0];
                spriteListRoad.add(roadRD);
                BufferedImage roadUT = sprites[12][0];
                spriteListRoad.add(roadUT);
                BufferedImage roadLT = sprites[13][0];
                spriteListRoad.add(roadLT);
                BufferedImage roadRT = sprites[14][0];
                spriteListRoad.add(roadRT);
                BufferedImage roadDT = sprites[15][0];
                spriteListRoad.add(roadDT);

                ArrayList<BufferedImage> spriteListRiver = new ArrayList<BufferedImage>();
                BufferedImage riverV = sprites[0][1];
                spriteListRiver.add(riverV);
                BufferedImage riverH = sprites[1][1];
                spriteListRiver.add(riverH);
                BufferedImage riverLU = sprites[2][1];
                spriteListRiver.add(riverLU);
                BufferedImage riverRU = sprites[3][1];
                spriteListRiver.add(riverRU);
                BufferedImage riverLD = sprites[4][1];
                spriteListRiver.add(riverLD);
                BufferedImage riverRD = sprites[5][1];
                spriteListRiver.add(riverRD);
                BufferedImage riverRoadV = sprites[6][1];
                spriteListRiver.add(riverRoadV);
                BufferedImage riverRoadH = sprites[7][1];
                spriteListRiver.add(riverRoadH);

                ArrayList<BufferedImage> spriteListTerrain = new ArrayList<BufferedImage>();
                BufferedImage grass = sprites[0][2];
                spriteListTerrain.add(grass);
                BufferedImage trees = sprites[1][2];
                spriteListTerrain.add(trees);
                BufferedImage mountain = sprites[2][2];
                spriteListTerrain.add(mountain);

                ArrayList<BufferedImage> spriteListOre = new ArrayList<BufferedImage>();
                BufferedImage copper = sprites[0][3];
                spriteListOre.add(copper);
                BufferedImage dornite = sprites[1][3];
                spriteListOre.add(dornite);
                BufferedImage kryz = sprites[2][3];
                spriteListOre.add(kryz);
                BufferedImage iron = sprites[3][3];
                spriteListOre.add(iron);
                BufferedImage shallux = sprites[4][3];
                spriteListOre.add(shallux);
                BufferedImage mithril = sprites[5][3];
                spriteListOre.add(mithril);

                ArrayList<BufferedImage> spriteListWood = new ArrayList<BufferedImage>();
                BufferedImage oak = sprites[0][4];
                spriteListWood.add(oak);
                BufferedImage olive = sprites[1][4];
                spriteListWood.add(olive);
                BufferedImage rath = sprites[2][4];
                spriteListWood.add(rath);
                BufferedImage yew = sprites[3][4];
                spriteListWood.add(yew);
                BufferedImage eeth = sprites[4][4];
                spriteListWood.add(eeth);
                BufferedImage ebony = sprites[5][4];
                spriteListWood.add(ebony);

                g.drawImage(spriteListTerrain.get((int) (Math.random() * 3)), i* width, j * height, this); //this one works by itself

                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

这是我的问题。为什么当我执行此代码时,每次调整窗口大小时它都会再次运行并重新制作我的地图?我认为添加滚动条可能会解决它,但我不知道如何添加它们。我怎样才能阻止它在每次调整大小时重新循环代码?

谢谢。

【问题讨论】:

    标签: java swing jpanel bufferedimage paintcomponent


    【解决方案1】:

    为什么当我执行此代码时,每次我调整窗口大小时它都会再次运行并重新制作我的地图?

    您创建地图的代码位于paintComponent() 方法中。每次 Swing 确定组件需要重新绘制时,都会调用此方法。调整框架大小是需要重新绘制组件的一种情况。

    因此,您的 paintComponent() 方法应该尽可能高效。您不应该在此方法中执行 I/O。

    您当前的代码对我来说没有多大意义。您有两个使用变量 i、j 的循环,但您使用硬编码值构建 ArrayList。唯一一次使用 i, j 变量是用于 drawImage() 方法。

    所以,我猜想,创建地图的代码应该在一个外部方法中完成,然后 paintComponent() 方法应该只在你的循环中调用 drawImage(..)。

    此外,由于 drawImage() 方法使用 random() 方法,因此每次调用 paintComponent() 方法时,您都会更改图像。这可能不是您想要的,因此实际上您可能需要在外部创建整个 BufferedImage。然后可以将图像添加到 JLabel 并将标签添加到框架中,这样您就不需要在面板上进行自定义绘画了。

    【讨论】:

    • 好吧,我也一直在修改我的代码来尝试这种方法。除了drawImage之外,我尝试从paintComponent中获取所有内容,除了drawImage永远不知道要绘制什么,因为似乎不可能将任何东西传递给PaintComponent。另外,我的地图制作程序的重点是要有一张随机地图。如果我摆脱了绘图代码中的随机性,它永远不会做我想做的事。我的代码很混乱,但你的建议更没有意义。
    • 我什至不明白的是,您如何调用paintComponent 方法?它总是抱怨 Graphics g 没有被定义,但我很确定你永远无法真正定义它,直到系统刚刚运行该方法并默认设置它。
    • 我假设您有一个名为“createMap”的方法。这应该在缓冲图像上创建一个随机映射。然后在 paintComponent() 方法中绘制此缓冲图像。如果要更改地图,则需要再次调用“createMap”方法。地图的随机化不应在 paintComponent() 方法本身中完成。您调用组件的 repaint() 方法强制重新绘制组件。也许Custom Painting Approaches 中的Draw on Image 示例将有助于基础知识。
    • 所以我弄清楚出了什么问题,现在我可以在每次程序运行时随机绘制图像并且它不会改变。但是当它打印图像时,只有第一行是半随机的,然后所有其他行都与第一行相同。我的 Create 方法将我的图像随机添加到 ArrayList 中,而我的paintComponent 查看该列表并以我喜欢的方式显示它们,它们并不是真正随机的。我觉得我这样做是错误的,但如果没有我的实际代码,很难真正解释。
    【解决方案2】:

    将感兴趣的对象绘制到BufferedImage 并放入标签中。请注意,它不会自动调整大小。

    或者,您可以将对象绘制到 BI 并简单地将其缩放到帧大小。这只有在需要很长时间才能构建时才有意义。


    我必须将所有这些保存到一个大型 BI 中,我不知道该怎么做。

    显然您了解如何处理Graphics 对象。可以使用 getGraphics()createGraphics() 从 BI 获取。

    【讨论】:

    • 如果我要这样做,我将不得不以某种方式将 80 个 BI 压缩为一个 BI。我的代码循环并每 64 像素放置一个新的 BI,直到它到达一行的末尾。所以我必须将所有这些保存到一个大型 BI 中,我不知道该怎么做。
    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    相关资源
    最近更新 更多