繁体   English   中英

Java Swing - 无法将滚动条添加到我的面板

[英]Java Swing - Cant add scrollbar to my panel

我正在尝试创建一个小型客户端,我可以在其中将坐标绘制到地图上。 我想首先将地图图像加载到 JPanel,然后将该面板添加到框架中。 图像非常大,因此您需要能够滚动才能看到所有图像。

但由于某种原因,我的滚动条不会出现。 我尝试了大多数指南,但它不起作用。

这是我的面板类:

public class MapPanel extends JPanel implements Pointable {

    private static final long serialVersionUID = 1L;
    private List<Shape> shapes = new LinkedList<>();


    public MapPanel() {
        Commander.getInstance().addShapeContainer(this);
        shapeContainerState = NoState.getInstance();
        MouseHandler mouseHandler = new MouseHandler(this);
        KeyListener keyListener = new KeyListener();

        this.addMouseListener(mouseHandler);
        this.addMouseMotionListener(mouseHandler);
        this.addKeyListener(keyListener);
        this.setBackground(Color.white);
        this.setFocusable(true);
        this.requestFocusInWindow();
    }

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

        BufferedImage image;
        try {
            image = ImageIO.read(new File("earthmap1.jpg"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        g.drawImage(image, 0, 0, null);
}

这是我的 JFrame 类:

public class MapFrame extends JFrame {

 public MapFrame() {
        buildTheUI();
        setUpEventHandling();
        mapPanel = new MapPanel();

        JScrollPane scrollPane = new JScrollPane(mapPanel);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(900, 800);
        this.add(scrollPane);
        this.setVisible(true);
    }
}

图像显示良好,如果我放大窗口,您可以看到更多内容(因为所有内容都没有显示),但没有滚动条,所以我可以通过滚动查看图像的其余部分。 在此处输入图像描述

您的问题是由于 JPanel 的首选尺寸 - 它需要与图像的尺寸相匹配。 我建议覆盖public Dimension getPreferredSize()方法并返回与图像大小匹配的维度。

附带问题:不要在诸如paintComponent之类的绘画方法中读入图像。 这些方法有助于确定程序的感知响应能力,并且需要尽可能快。 更重要的是,没有理由在每次 JPanel 重新绘制时重新读取图像,而是读取一次图像,例如在类的构造函数中。

例如,

public class MapPanel extends JPanel implements Pointable {

    private static final long serialVersionUID = 1L;
    private List<Shape> shapes = new LinkedList<>();
    private BufferedImage image = null;


    public MapPanel() throws IOException {
        Commander.getInstance().addShapeContainer(this);
        shapeContainerState = NoState.getInstance();
        MouseHandler mouseHandler = new MouseHandler(this);
        KeyListener keyListener = new KeyListener();

        this.addMouseListener(mouseHandler);
        this.addMouseMotionListener(mouseHandler);
        this.addKeyListener(keyListener);
        this.setBackground(Color.white);
        this.setFocusable(true);
        this.requestFocusInWindow();
        
        image = ImageIO.read(new File("earthmap1.jpg"));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        if (image != null) {
            g.drawImage(image, 0, 0, null);
        }
    }
        
    @Override
    public Dimension getPreferredSize() {
        if (image == null) {
            return super.getPreferredSize();
        } else {
            int w = image.getWidth();
            int h = image.getHeight();
            return new Dimension(w, h);
        }
    }
    
}

注意:代码未经测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM