簡體   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