【问题标题】:Prevent JPanel within JScrollPane from growing horizontally防止 JScrollPane 中的 JPanel 水平增长
【发布时间】:2018-09-30 04:40:23
【问题描述】:

我有一个带有 FlowLayout 的 JPanel,我正在动态地填充相同的组件(MWE 中的 JButtons)。 JPanel 在 JScrollPane 内。当我添加组件时,我希望它们从左到右填充,一旦顶行变得比 JScrollPane 更宽,就会向下移动到下一行。

我的问题是 FlowLayout 反而扩大了 JPanel 令人作呕的范围,JScrollPane 通过添加水平滚动来响应。如何防止这种情况发生?

编辑:我见过 WrapLayout;因为我在我的应用程序中使用 NetBeans GUI Builder,所以我希望在标准 Java 中找到一个解决方案。

MWE 基于this answer:

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.awt.*;
import javax.swing.JScrollPane;

public class MWE extends JFrame implements ActionListener {

    JPanel panel;
    JScrollPane pane;

    public MWE() {
        super("Add component on JFrame at runtime");
        setLayout(new BorderLayout());

        this.panel = new JPanel();
        this.pane = new JScrollPane();
        this.panel.setLayout(new FlowLayout(FlowLayout.LEFT));
        this.pane.setViewportView(this.panel);
        add(pane, BorderLayout.CENTER);

        JButton button = new JButton("CLICK HERE");
        add(button, BorderLayout.SOUTH);
        button.addActionListener(this);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 500);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent evt) {
        this.panel.add(new JButton("Button"));
        this.panel.revalidate();
        validate();
    }

    public static void main(String[] args) {
        MWE mwe = new MWE();
    }
}

【问题讨论】:

  • 标准 JDK 布局管理器不支持此功能。查看:stackoverflow.com/questions/3592828/… 获取一种解决方案。
  • 嗯,这太可怕了。甲骨文一定非常喜欢horiscrolling。
  • I was hoping for a solution within standard Java since I'm using NetBeans GUI Builder - 使用 IDE 并不妨碍您使用其他类。
  • 我知道,但我越是手写或使用外部库,就越无法利用可视化 GUI 构建器。
  • 你在往后想。 IDE 正在控制/限制您可以执行的操作。如果您转向不同的想法,您将需要重新学习 IDE。最好学习如何使用 Java 以及 IDE 如何提供帮助。 IDE 适用于基本的编码和调试,但不要让它控制您设计应用程序的方式。

标签: java swing jpanel jscrollpane flowlayout


【解决方案1】:

尝试为面板设置首选尺寸:

this.panel.setPreferredSize(new Dimension(500, 500));

【讨论】:

  • (1-) 那么首选大小永远不会随着您添加/删除组件或框架大小的变化而改变。设置首选尺寸是布局管理器的工作。
  • @camickr 你试过了吗?因为我这样做了,并且在调整框架大小时大小会发生变化。这只是一种解决方法,我相信有更好的方法来做到这一点。
  • 问题是首选大小不是动态重新计算的,您给出的任何大小都只是一个疯狂的猜测。滚动只会起作用,直到它不起作用,因为它不是基于组件的实际布局。 I'm sure there is a better way to do this. - 请参阅我原始评论中的链接。
  • 我已经看过了,我添加了我的答案,因为 OP 正在标准 java.xml 中寻找一些东西。还是谢谢!
  • 它不能解决问题。也许你还是不明白这个问题?更改您的建议以使用 (200, 110) 的首选大小并在框架上使用 pack() 而不是 setSize()。现在,当您单击按钮时,按钮将在 2 处换行,这对于前 6 个按钮非常有用。然后尝试添加第 7 个。您只会看到第 7 个按钮的一半,并且不会出现滚动条。查看按钮的唯一方法是调整框架的大小。 JScrollPane 的要点是滚动条应在需要时出现。此逻辑取决于动态首选大小计算。
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
相关资源
最近更新 更多