【问题标题】:PaintComponent not working as expected on a JPanel inside a JScrollPanePaintComponent 在 JScrollPane 内的 JPanel 上未按预期工作
【发布时间】:2014-04-21 01:52:19
【问题描述】:

正如标题所示,我正在尝试在JScrollPane 内绘制JPanel(因为面板几乎总是会溢出屏幕,所以我需要能够滚动)。我遇到了一个奇怪的问题,PaintComponent 方法没有像我预期的那样绘制。我目前只是尝试用纯色填充JPanel,但实际上并没有填充JPanel,它实际上只是绘制了一个未填充的框,例如,它已部分填充但未完全填充。

我的JPanel 的代码(请注意simPanel 是JSCROLLPANE):

private class myPanel extends JPanel {
    @Override
    public void paintComponent (Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillRect(0, 0, simPanel.getWidth(), simPanel.getHeight());
    }
}

我的WindowResizeListener 附加到JScrollPane 本身并运行以下方法,到目前为止,它似乎可以正确调整大小,因为我一直在使用打印语句来获取滚动窗格的大小并且它变得更大/更小当我调整应用程序的大小时。

public void componentResized(ComponentEvent ce) {
    myJPanel.setSize(simPanel.getSize());
}

如果JPanel 未添加到JScrollPane(即,它被添加到另一个JPanel 或类似的)但JScrollPane 本身似乎不想正确绘制,这将按预期工作。我想知道我是否缺少某些东西。看起来我的 JPanel 大小合适,因为该框在滚动窗格本身内的大小是正确的,即使我正在调用 fillRect,我也无法填充它。

编辑:我认为这可能与 ScrollPane 的大小有关。我目前正在使用不同的布局管理器,并注意到滚动窗格的大小非常喜怒无常,并且由于某种原因不断回到固定大小......

【问题讨论】:

  • 为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。

标签: java swing jpanel jscrollpane paintcomponent


【解决方案1】:

我的 JPanel 的代码(请注意 simPanel 是 JSCROLLPANE):

您的 JPanel 的绘制代码不应引用滚动窗格的大小。在任何情况下,您只需使用面板的setBackground(...) 方法来设置其背景颜色。

JScrollPane(因为面板几乎总是会溢出屏幕,所以我需要能够滚动)

当面板的preferredSize 大于滚动面板的大小时,滚动条会自动出现。面板的布局管理器负责确定面板的首选尺寸,因此您不需要任何自定义代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-20
    • 2010-10-23
    • 2017-03-10
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    相关资源
    最近更新 更多