【问题标题】:Unable to see all the images i paint and can't get a JScrollPane to work无法看到我绘制的所有图像,也无法让 JScrollPane 工作
【发布时间】:2012-02-15 20:12:52
【问题描述】:

所以我的问题是我正在绘制许多图像以查看并且我无法显示 JScrollPane 条,因此我可以查看所有图像。

我的代码是这样的。

您将需要 40 x 40 的图像,否则会出错。文件名为“Wall.gif”、“DefualtTileBackup.gif”、“Character.gif”、“metal3.jpg”和“DefualtTileBackup.gif”

import java.awt.*;
import java.util.*;
import javax.swing.*;

import java.net.*;

public class DrawImage extends JPanel {
    private Image image;
    Toolkit tk = Toolkit.getDefaultToolkit();
    private char[][] fieldMap = {
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','S','M','@','Z','#','#','#','#','#','#','#','#','#','#','#','#','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','S','M','@','Z','#','#','#','#','#','#','#','#','#','#','#','#','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','S','M','@','Z','#','#','#','#','#','#','#','#','#','#','#','#','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','S','M','@','Z','#','#','#','#','#','#','#','#','#','#','#','#','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','S','M','@','Z','#','#','#','#','#','#','#','#','#','#','#','#','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','S','M','@','Z','#','#','#','#','#','#','#','#','#','#','#','#','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','S','M','@','Z','#','#','#','#','#','#','#','#','#','#','#','#','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},
            {'$','S','M','@','Z','#','#','#','#','#','#','#','#','#','#','#','#','$'},
            {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$','$'},

        };
    public static void main(String[] args) {
        JFrame frame = new JFrame("DrawImage");
        frame.setSize(600,600);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(new DrawImage()));
    }

public DrawImage() {
    super();
    setVisible(true);   

}


private URL getURL(String filename) {
    URL url = null;
    try {
        url = this.getClass().getResource(filename);
    }

    catch (Exception e) { }
    return url;
}
public void paint(Graphics g) {

    //create an instance of Graphics2D
    Graphics2D g2d = (Graphics2D) g;
    //fill the background with black
    g2d.setColor(Color.GREEN);
    g2d.fillRect(0, 0, getSize().width, getSize().height);

    //draw the image
    for(int K = 0; K < this.fieldMap.length ; K = K+1){
    for(int J = 0; J < this.fieldMap[K].length; J = J + 1){
    g2d.drawImage(imagePlacer(this.fieldMap[K][J]),(J*40),(K*40), this );
        } // loop Y end
    }// loop X end
}// paint end

public Image imagePlacer(char tiles){


            try {
                switch(tiles){

                case('$'):
                    System.out.println("Wall, $");
                     image = tk.getImage(getURL("Wall.gif"));
                     break;


                case('F'):
                    System.out.println("Floor, #");
                     image = tk.getImage(getURL("DefualtTileBackup.gif"));
                     break;


                case('@'):
                    System.out.println("Character, @");
                     image = tk.getImage(getURL("Character.gif"));
                     break;


                case('M'):

                    System.out.println("Monster, !");
                     image = tk.getImage(getURL("metal3.jpg"));
                     break;

                default:
                        System.out.println("defualt,?");
                        image = tk.getImage(getURL("DefualtTileBackup.gif"));
                      break;

                    // end default
                }// end switch
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    return image;
}//end method
}// end class

程序似乎运行正常,但我没有滚动条。

【问题讨论】:

  • 您已经描述了一个问题以及您如何做不到,但到目前为止还没有提出任何问题。你有问题吗?
  • 我不知道如何,但我在编辑中添加了更多内容。我的问题是我无法与 JScrollPane 进行任何交互,因此我可以看到地图的其余部分。
  • “我不明白” 添加信息请求,后跟“?”。例如。 “如何让滚动条出现?”(这不是火箭科学。)

标签: java image swing jscrollpane paintcomponent


【解决方案1】:

您需要为面板提供尺寸。据我所见,面板不包含任何其他组件,因此布局管理器通常会尝试将其放入可用空间。

如果我计算正确,您有一个 18x18 的网格,因此您的面板尺寸至少需要为 720x720(我假设您有 18x18 的 40x40 图像的图块)。尝试在您的面板上调用setMinimumSize(new Dimension(720,720))

编辑

正如@camickr 正确指出的那样,JScrollPane 将使用面板的首选大小。因此,您可以尝试在外部设置它 (setPreferredSize(...)),或者,由于您已经在扩展面板并且子类具有所需的信息,因此覆盖面板的 getPreferredSize() 以返回计算出的首选大小。

【讨论】:

  • +1 用于尺寸问题。但是,解决方案应该是覆盖 getPreferredSize() 方法以返回面板的正确尺寸。滚动窗格使用首选大小,而不是最小大小。
  • 对不起,我没有早点回复,但是,我有点忙于上大学。因此,我在本周使用 setMinimumSize 早期尝试了您的第一个解决方案,但没有机会回复。好吧,正如camickr指出的那样,它没有用。我刚刚尝试了 PreferredSize 方法,是的,它是 7200x7200,它似乎正在工作。谢谢大家的帮助。还有关于swing的内部工作原理的很好的参考吗? Swing 的约定似乎是我遗漏的第一件事。
  • @JayCD Oracle's Swing Documentation 应该提供您需要的信息(例如布局的工作原理等)
【解决方案2】:

其他问题

1) 请将public void paint(Graphics g) { 更改为public void paintComponent(Graphics g) {

供画到Swing JComponent使用方法paintComponent()

2) frame.setVisible(true); 必须是 main 方法中的最后一行代码

3) 最好将Image 作为Icon 放在JLabel 中,并使用GridLayout 放在JPanel

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多