【发布时间】: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