【问题标题】:JScrollPane drawing components under itselfJScrollPane 在自身下绘制组件
【发布时间】:2016-04-26 17:43:19
【问题描述】:

我在 JTabbedPane 选项卡中有一个 JScrollPane。在该 JScrollPane 中,我放置了一个 JPanel,其背景为红色,并且明确设置了其大小。

这是我得到的:

请注意,在第二张图片中,容器框架已调整大小,组件被绘制在滚动条元素下

这里发生了什么?我已经尝试了所有涉及的组件的布局管理器的几乎所有组合(以及除了 JPanel 之外的组件 - 最终我想要几个 JEditorPane 在这里),除了在一个大的空白矩形下(是背景?哪个?)

代码:

在主要的 JFrame 子类中:

// Called once on startup/layout.
public void refreshGUIState() {
    for (int i = 0; i < client.getFrameStackLength(); i++) {
        InferenceFrame frame = client.getFrame(i);
        JScrollPane pane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                                           JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        JPanel wtf = new JPanel();
        pane.setBackground(Color.YELLOW);
        wtf.setBackground(Color.red);
        wtf.setSize(100,100);
        wtf.setPreferredSize(wtf.getSize());
        pane.add(wtf);
        workspace.addTab(Integer.toString(i), pane);
    }
}

public GuiClient() throws CliException, ParticleSourceException {
    super("L4 Interactive Prover");
    setSize(800,600);

    mainArea = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);
    mainArea.setDividerSize(2);
    mainArea.setBackground(Color.DARK_GRAY);
    getContentPane().add(mainArea);

    /* ... menu bar init ... */

    toolspace = new JPanel();
    workspace = new JTabbedPane();
    mainArea.add(toolspace);
    mainArea.add(workspace);

    this.validate();
    refreshGUIState();
}

编辑:怀疑 JScrollPane 在添加第一个子项时不知何故没有创建视口,正如预期的那样,我还尝试了三参数构造函数。同样的行为。

重新编辑:除了我犯错并留在 add() 调用中。哎呀。好像是这样。

【问题讨论】:

  • 我猜你忘了把东西添加到滚动窗格中。
  • 我在“pane.add(wtf);”的行上这样做。代码就在那里……你可以在图像中看到它,它就在一个灰色的矩形下方。所以...... .
  • 你在哪里设置框架可见?
  • 在 main() 中。显然框架是可见的,或者你不会在屏幕截图中看到它。 main() 所做的只是创建新实例,设置默认关闭操作,然后 setVisible()。
  • 我很确定你需要pane.setViewportView(wtf) 而不是pane.add(wtf)。或者,您可以在初始化 JScrollPane 时执行此操作:new JScrollPane(wtf)

标签: java swing user-interface jscrollpane


【解决方案1】:

代替

pane.add(wtf);

你需要

pane.setViewportView(wtf);

你也可以在初始化 JScrollPane 时这样做:

JScrollPane pane = new JScrollPane(wtf);

或者,在你的情况下:

JScollPane pane = new JScrollPane(wtf, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

【讨论】:

    猜你喜欢
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 2013-11-12
    • 2014-03-13
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多