为什么我的JScrollPane无法正常工作?

时间:2012-06-20 10:07:13

标签: java swing jpanel jscrollpane

有人可以解释为什么JScrollPane无效。也许我可能错过了一些东西。我意识到这可能是愚蠢的,没有比我所展示的更多的背景,但请问我,我很乐意提供更多。

public ApplicationFrame(String title, int x, int y, int width, int height) {
        // Constructor for the ApplicationFrame, no implicit Construc.
        setTitle(title);
        setResizable(true);
        setBounds(x, y, width, height);
                    setLayout(new BorderLayout());
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setIconImage(new ImageIcon(getClass().getResource("resources/topLeft.png")).getImage());
        topMostMenuBar = new TopMenuBar(this);
        setJMenuBar(topMostMenuBar.getMyJMenuBar());
        paneEdge = BorderFactory.createLineBorder(Color.gray);
        blackline = BorderFactory.createLineBorder(Color.black);
        this.frameContent = new ApplicationPanel() {
            //@Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(TI, 0, 0, null);
            }
        };
        mainImageScrollPane = new JScrollPane(frameContent);
        statusPanel = new ApplicationPanel(new Color(0xfff0f0f0));
        leftPanel = new ApplicationPanel(new Color(0xfff0f0f0));
        testPanel = new ColorPanel(new Color(0xfff0f0f0));
        testPanel.setPreferredSize(new Dimension(50,300));
        add(mainImageScrollPane, BorderLayout.CENTER );
        add(statusPanel, BorderLayout.SOUTH);
        add(leftPanel, BorderLayout.WEST);
        Container visibleArea = getContentPane();
        visibleArea.add(frameContent);
        setVisible(true);
        do {
            loadImageIn();
        } while (!initLoadSuccess);
        initButtons();
        leftPanel.add(testPanel, BorderLayout.SOUTH);
    } // end Constructor **

这是一段很大的代码,所以我不确定如何制作SSCCE。您正在查看的是JFrame的子类的构造函数,它包含3个面板。此时ApplicationPanel只是JPanelloadImageIn()方法打开文件追踪器,然后加载绘制到frameContent上的所选图像。图像显示正常,一切正常,除非我调整窗口大小,没有滚动条。

3 个答案:

答案 0 :(得分:2)

您有此行,会将ApplicationPanel添加到visibleArea ...

visibleArea.add(frameContent);

也许你真的是这个意思,这会将JScrollPane添加到visibleArea(而JScrollPane已经包含ApplicationPanel)...

visibleArea.add(mainImageScrollPane);

当你致电new JScrollPane(frameContent)时,它对它内部的面板没有任何作用,它只是在外面添加一个包装器。所以,如果你想要滚动的能力,你需要引用JScrollPane包装器,而不是面板本身。

答案 1 :(得分:0)

您没有为frameContent指定任何尺寸。这是故意的吗?

此外,您的frameContent稍后会被添加到visibleArea。含义不再出现在mainImageScrollPane JScrollPane

也许你想拥有: visibleArea.add(mainImageScrollPane);,但您需要设置面板​​尺寸

答案 2 :(得分:0)

mainImageScrollPane.setViewportView(<component_to_be_scrollable>);