【发布时间】:2019-12-21 15:38:08
【问题描述】:
我有这段代码(一个包含其他JComponents 的面板,在本例中为JButtons)和一个问题。
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.util.*;
public class JTagPanelTest extends JPanel{
public JTagPanelTest(){
setLayout(new FlowLayout(FlowLayout.LEADING, 2, 0));
}
public void initializeTags(List<String> tags){
tags.forEach(tag -> add(new JButton(tag)));
}
public static void main(String[] args){
EventQueue.invokeLater(() -> {
try{
String lookAndFeelName = UIManager.getSystemLookAndFeelClassName();
UIManager.setLookAndFeel(lookAndFeelName);
}
catch(Exception e){
e.printStackTrace();
}
JTagPanelTest test = new JTagPanelTest();
test.initializeTags(Arrays.asList("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
"012", "qwer", "z<xc", "rty", "poiu", "gfj", "zxcv", "mjnb", "mko", "nij", "bhu"));
JScrollPane scrollPane = new JScrollPane(test);
scrollPane.setHorizontalScrollBar(null);
test.setPreferredSize(new Dimension(200, 100));
// scrollPane.setPreferredSize(new Dimension(200, 180));
JFrame frame = new JFrame("Test");
frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(new Dimension(200, 180));
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
});
}
}
我虽然将我的JTagPanelTest 放在JScrollPane 中使其滚动就足够了,但事实并非如此,我真的不知道为什么。
计算内部面板的最终高度没有用,因为它的结果是0。
注意JButtons 的数量不是固定的,所以面板必须是可滚动的才能显示所有的“按钮”。
有没有人能让我意识到我的错误?
谢谢
【问题讨论】:
-
请注意,所有 Swing 组件都应在事件调度线程 (EDT) 上创建。所以所有的代码,不仅仅是 setVisible(...) 应该是
invokeLater(...)的一部分 -
test.setPreferredSize(new Dimension(200, 100));人为地限制了测试 JPanel 的大小。你绝对不想想要这样做。 -
如果我删除该行按钮不会在面板边缘换行
标签: java swing jscrollpane jcomponent