Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何限制在窗体或面板的边框内动态添加组件_Java_Swing_Size_Panel_Border - Fatal编程技术网

Java 如何限制在窗体或面板的边框内动态添加组件

Java 如何限制在窗体或面板的边框内动态添加组件,java,swing,size,panel,border,Java,Swing,Size,Panel,Border,我试图从数据库中一个接一个地动态地将组件添加到jpanel中,但是它们在水平方向上超出了表单(甚至屏幕)的限制。我使用的是BoxLayout面板,它将内部组件定位在x轴上。我想做的是限制在窗体边界(或容器面板边界)的x轴上添加组件。 到目前为止,我尝试的是: 设置文件的最大大小(宽度)的步骤 容器jpanel,但那没有 工作 将布局管理器设置为 flowlayout,但它也会扩展 在x轴上无限远 将容器面板放置在 滚动窗格。这是一个巨大的挑战 水平滚动条,这意味着 它没有将组件限制为 窗体的边

我试图从数据库中一个接一个地动态地将组件添加到jpanel中,但是它们在水平方向上超出了表单(甚至屏幕)的限制。我使用的是BoxLayout面板,它将内部组件定位在x轴上。我想做的是限制在窗体边界(或容器面板边界)的x轴上添加组件。 到目前为止,我尝试的是:

  • 设置文件的最大大小(宽度)的步骤 容器jpanel,但那没有 工作
  • 将布局管理器设置为 flowlayout,但它也会扩展 在x轴上无限远
  • 将容器面板放置在 滚动窗格。这是一个巨大的挑战 水平滚动条,这意味着 它没有将组件限制为 窗体的边框
我应该做一个自定义布局吗?还有比这更简单的想法吗? 我的代码如下所示:

jpanelCases.setLayout(new BoxLayout(this.jpanelCases, BoxLayout.X_AXIS));
db = Database.getInstance();
List<Category> cats = db.getCategories();
for(Category c : cats){
            JPanel jp = new JPanel();
            //addition of other components to the newly created panel here
            jpanelCases.add(jp);
}
jpanelcase.setLayout(新的BoxLayout(this.jpanelcase,BoxLayout.X_轴));
db=Database.getInstance();
List cats=db.getCategories();
适用于(c类:猫){
JPanel jp=新的JPanel();
//将其他组件添加到此处新创建的面板
jpanelCases.add(jp);
}

试着放两个胶水,一个在前一个在后一个:

jpanelCases.setLayout(new BoxLayout(this.jpanelCases, BoxLayout.X_AXIS));

jpanelCases.add(Box.createHorizontalGlue());

db = Database.getInstance();
List<Category> cats = db.getCategories();
for(Category c : cats){
            JPanel jp = new JPanel();
            //addition of other components to the newly created panel here
            jpanelCases.add(jp);
}

jpanelCases.add(Box.createHorizontalGlue());
jpanelcase.setLayout(新的BoxLayout(this.jpanelcase,BoxLayout.X_轴));
jpanelCases.add(Box.createHorizontalGlue());
db=Database.getInstance();
List cats=db.getCategories();
适用于(c类:猫){
JPanel jp=新的JPanel();
//将其他组件添加到此处新创建的面板
jpanelCases.add(jp);
}
jpanelCases.add(Box.createHorizontalGlue());

在JPanel上使用JScrollPane怎么样?这将包含面板内的元素,而不超过其物理边界。否则,如果您不喜欢滚动的想法,我建议您以某种方式跟踪添加到面板的元素相对于面板物理宽度的总宽度总和,并在添加到总和的下一个元素宽度超过面板宽度时停止添加元素

我希望这有帮助

但是,它们在水平方向上超出了窗体(甚至屏幕)的限制

那么,在这种情况下,您想做什么:

a) 只需忽略这些组件,而不要将它们添加到框架中 b) 在新行上显示组件


如果答案是“b”,请尝试。

我假设所有这些都发生在渲染帧之前?否则,我看不到在不调用
revalidate()
的情况下将组件添加到面板中会如何导致它们“动态”呈现是的,在呈现之前,在表单的构造函数中添加一次我想要第二种情况,WrapLayout工作得很好!但是,对于大量内部组件,jscrollpane是必需的。在这种情况下,它会在y轴上展开,我认为这是更好的选择。使用JscrollPane会在x轴上引入一个滚动条,我认为这比在y轴上滚动要不那么方便。