【问题标题】:Updating JPanel's within a JScrollPane not working在 JScrollPane 中更新 JPanel 不起作用
【发布时间】:2013-01-10 19:12:35
【问题描述】:

我创建了一个JScrollPane 并希望根据我从用户那里得到的输入在该JScrollPane 中显示一个不同的JPanel。出于某种原因,我的JScrollPane 保持空白并且从不绘制Panel 中的内容。

private JScrollPane panelView;

// Creating my ScrollPane with a blank JPanel
panelView = new JScrollPane(new JPanel());
// Scenario1 is my top level JPanel, also contains a JTree
scenario1.add(panelView, BorderLayout.CENTER);

当我获得更新显示的 JPanel 的操作时我的代码。我已经通过调试器确认我正确地点击了这段代码。

// Remove previous displayed JPanel within JScrollPane
panelView.removeAll();
if(node.equals(nodes.loginDefaultUser))
    {
        loginDefaultUserPanel = new LoginDefaultUserPanel();    
        panelView.add(loginDefaultUserPanel);
    }
    else if(node.equals(nodes.addUsers))
    {
        addUsersPanel = new AddUsersPanel();
        panelView.add(addUsersPanel);
    }
    else if(node.equals(nodes.getVersions))
    {
        getVersionsPanel = new GetVersionsPanel();
        panelView.add(getVersionsPanel);
    }
    panelView.revalidate();
    panelView.repaint();

【问题讨论】:

  • 删除panelView.removeAll(),只使用panelView.setViewportView

标签: java swing jpanel jscrollpane


【解决方案1】:

使用JScrollPane#setViewportView 而不是add

您可能会发现正在查看 How to use Scroll Panes 的使用情况

【讨论】:

  • 我试了一下,但仍然是相同的行为(抱歉我的评论格式有问题)。例如:if(node.equals(ndes.loginDefaultUser)) { loginDefaultUserPanel = new LoginDefaultUserPanel(); panelView.setViewportView(loginDefaultUserPanel); //panelView.add(loginDefaultUserPanel); }
  • 啊,刚刚想通了。一旦我用 setViewportView 替换了 add ,然后还从方法的开头删除了我的 panelView.removeAll(); ,那么它就起作用了。我不知道为什么我不必删除以前的面板(或者为什么它一开始就破坏了事情),但现在看起来是正确的。
  • @Matt 您不需要显式删除前一个组件,因为视口设计为仅支持单个子组件,调用setViewportView 将在添加新组件之前自动删除前一个子组件。 ..调用removeAll 将从JScrollPane 中删除所有孩子——包括JViewport——你不想这样做;)
  • 谢谢。我很感激你的解释,你很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2016-03-17
  • 2012-08-05
  • 2014-12-06
相关资源
最近更新 更多