Java 为什么';我的JScrollPane是否显示我的JPanel?

Java 为什么';我的JScrollPane是否显示我的JPanel?,java,swing,jpanel,jscrollpane,layout-manager,Java,Swing,Jpanel,Jscrollpane,Layout Manager,我有一个JPanel,我希望它能够滚动,所以我将它添加到一个JScrollPane中,但是我的JScrollPane没有完全显示我的面板。只显示它的一个很小的角,它也不会滚动。但是,当我只将LPanel添加到JFrame时,它显示正确! 有人能告诉我我做错了什么吗 有关我的代码的信息: LPanel是从JPanel扩展而来的,我已经覆盖了这个绘制。但作为 我说,油漆很好用!它有自己的宽度和高度 是2^k k是我的面板中的行数 这是我的代码: public class Graphics ext

我有一个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);
  }
}
公共类图形扩展JFrame{
LPanel面板;
int k;
公共图形(int k1){
setLayout(空);
这是k=k1;
面板=新的LPanel(k);
面板.设置尺寸(面板.宽度*30,面板.高度*30);
新覆盖件(k,面板);
JScrollPane=新的JScrollPane(面板);
窗格。设置位置(20,20);
if(k<4){
窗格.设置尺寸(面板.宽度*30,面板.高度*30);
此.setSize(面板宽度*30+80,面板高度*30+80);
}否则{
窗格设置尺寸(面板宽度*30600);
此设置尺寸(面板宽度*30+80600);
}
getContentPane()。添加(窗格);
此.setDefaultCloseOperation(关闭时退出);
setVisible(真);
}
公共静态void main(字符串[]args){
新图形(3);
}
}

有人能帮我吗?

您已将滚动条添加到滚动窗格中。e、 g

 JScrollPane pane = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
我不能补充一个例子

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

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

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

它自身的宽度和高度为2^k


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

您需要为您的JPanel提供支持,否则JScrollPane不知道滚动条需要支持的组件有多大
setSize
有不同的用途,在这个cas中是不够的。

它甚至不能完全显示我的面板!!左上角只有一个10像素*10像素的正方形:(为了尽快得到更好的帮助,先发布一个.
setLayout(null);
删除那些废话。别忘了
pack()上面的代码表明您已经添加了代码!只需将该代码更改为SSCCE by.-1,您不应该设置首选大小。正如前面所提到的,首选方法是重写getPreferredSize()方法。此外,您的链接是错误的。似乎不需要“wise”如果可以知道首选大小,则重写getter而不是使用标准提供的setter。链接现在已更正。当创建自定义组件时(这基本上就是您在自定义绘制时所做的),则呈现组件的逻辑应该是自包含的。即组件本身显示“知道什么”它的首选大小应该为,这就是您重写getPreferredSize()的原因方法。您不应该让程序员随机选择组件的大小。不同意,我真的不希望在我的库中有一个JList或JTextArea,它对应该是哪个大小有自己的固定意见。如果没有像JLabel那样设置,组件最多可以计算默认的准备大小。
最多,组件NET可以准确地计算默认的准备大小。这就是Swing设计的工作方式,也是您重写getPreferredSize()方法的原因。这就是为什么JList具有
setVisibleRows()的原因
method或JTextArea允许您指定要显示的行/列。然后可以根据当前字体、渲染器或确定适当大小所需的任何其他内容来计算首选大小。这就是Swing跨平台的方式。