【问题标题】:Why doesn't my JScrollPane shows my JPanel?为什么我的 JScrollPane 不显示我的 JPanel?
【发布时间】:2013-04-14 11:43:14
【问题描述】:

我有一个 JPanel,我希望它能够滚动,所以我将它添加到 JScrollPane,但我的 JScrollPane 没有完全显示我的面板。只显示了它的一个很小的角落,它也不会滚动。但是当我只将 LPanel 添加到我的 JFrame 时,它​​会正确显示! 有人可以告诉我我在这里做错了什么吗?

关于我的代码的信息:

  • LPanel 是从 JPanel 扩展而来的,我已经覆盖了绘制。但作为 我说,油漆很好用!它有自己的宽度和高度 是 2^k。
  • k 是我的面板中的行数。

这是我的代码:

public class Graphics extends JFrame {
  LPanel panel;
  int k;
  public Graphics(int k1) {
    setLayout(null);
    this.k = k1;
    panel = new LPanel(k);
    panel.setSize(panel.width * 30, panel.height * 30);
    new CoveringwithLs(k, panel);
    JScrollPane pane = new JScrollPane(panel);
    pane.setLocation(20, 20);
    if (k < 4) {
      pane.setSize(panel.width * 30, panel.height * 30);
      this.setSize(panel.width * 30 + 80, panel.height * 30 + 80);
    } else {
      pane.setSize(panel.width * 30, 600);
      this.setSize(panel.width * 30 + 80, 600);
    }
    getContentPane().add(pane);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
  }
  public static void main(String[] args) {
    new Graphics(3);
  }
}

谁能帮帮我?

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • setLayout(null); 去掉那些废话,开始吧。
  • 别忘了pack()
  • 我无法添加示例,因为我是新手,没有足够的声誉:(
  • “我无法添加示例,” 上面的代码表明您已经添加了代码!只需通过 editing the question 将该代码更改为 SSCCE。

标签: java swing jpanel jscrollpane layout-manager


【解决方案1】:

我无法添加示例,

当然可以。你已经有了。现在您需要做的是遵循给出的建议并使用布局管理器而不是空布局。

LPanel 是从 JPanel 扩展而来的,我已经覆盖了绘制。

自定义绘画是通过覆盖paintComponent() 方法而不是paint() 方法来完成的。

它有自己的宽度和高度,即 2^k。

您需要覆盖面板的getPreferredSize() 方法以返回维度。然后滚动窗格将正常工作。

【讨论】:

    【解决方案2】:

    您是否已将滚动条添加到 ScrollPane。例如

     JScrollPane pane = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    

    【讨论】:

    • 它甚至没有完全显示我的面板!!只有一个 10 像素* 10 像素的正方形在左上角 :(
    【解决方案3】:

    您的 JPanel 需要 set the preferred size,否则 JScrollPane 不知道它需要用滚动条支持的组件有多大。 setSize 有不同的目的,在这种情况下是不够的。

    【讨论】:

    • -1,您不应该设置首选尺寸。正如已经提到的,首选方法是覆盖 getPreferredSize() 方法。另外,你的链接是错误的。
    • 如果可以知道首选大小,似乎没有必要“明智”地覆盖 getter 而不是使用标准提供的 setter。链接现已更正。
    • 当你创建一个自定义组件时,这基本上就是你在做自定义绘画时所做的,那么渲染组件的逻辑应该是自包含的。那是组件本身显示知道它的首选大小应该是什么,这就是为什么您覆盖 getPreferredSize() 方法。你不应该让程序员随机选择组件的大小。
    • 不同意,我真的不希望我的库中有一个 JList 或 JTextArea 对它应该是什么大小有自己的不变意见。如果没有像 JLabel 那样设置,组件最多可以计算默认的准备大小。
    • At most, the component could compute the default prepared size - 没错。这就是 Swing 设计的工作方式,这就是为什么要覆盖 getPreferredSize() 方法。这就是为什么 JList 有 setVisibleRows() 方法,或者 JTextArea 允许您指定要显示的行/列。然后可以根据当前字体、渲染器或确定适当大小所需的任何其他内容来计算首选大小。这就是 Swing 成为跨平台的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多