面板不想滚动
panel doesn't want to scroll
我有这段代码(一个包含其他 JComponent
s 的面板,在本例中为 JButton
s)和一个问题。
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
。
请注意 JButton
的数量不固定,因此面板必须可滚动才能显示所有 "buttons"。
有没有人可以让我知道我的错误?
谢谢
您通过在 scrollPane
上设置首选尺寸尝试了正确的方法。
因此恢复到该更改。它不滚动的原因是因为您的内容没有添加为垂直对齐。设置有助于垂直添加项目的布局。
例如:
test.setLayout(new BoxLayout(test, BoxLayout.Y_AXIS));
//test.setPreferredSize(new Dimension(200, 100));
scrollPane.setPreferredSize(new Dimension(200, 180));
我还找到了 this code that resolves the problem of vertical stacked components. And this one。
我知道您希望按钮换行,因此您将它们添加到使用 FlowLayout
布局管理器的 JPanel
。我还了解到您希望包含这些按钮的 JPanel
滚动。我通过设置包含按钮的 JScrollPane
和 JPanel
的首选大小来实现这一点,如下面的代码所示。
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.Arrays;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;
public class BtnScrl implements Runnable {
public void run() {
showGui();
}
private void showGui() {
JFrame frame = new JFrame("BtnScrl");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(createButtons());
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JScrollPane createButtons() {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(400, 290));
for (String tag : Arrays.asList("one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
"ten",
"012",
"qwer",
"z<xc",
"rty",
"poiu",
"gfj",
"zxcv",
"mjnb",
"mko",
"nij",
"bhu")) {
panel.add(new JButton(tag));
}
JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.setPreferredSize(new Dimension(400, 100));
return scrollPane;
}
public static void main(String[] args) {
EventQueue.invokeLater(new BtnScrl());
}
}
这是 运行 应用程序的屏幕截图。
我有这段代码(一个包含其他 JComponent
s 的面板,在本例中为 JButton
s)和一个问题。
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
。
请注意 JButton
的数量不固定,因此面板必须可滚动才能显示所有 "buttons"。
有没有人可以让我知道我的错误?
谢谢
您通过在 scrollPane
上设置首选尺寸尝试了正确的方法。
因此恢复到该更改。它不滚动的原因是因为您的内容没有添加为垂直对齐。设置有助于垂直添加项目的布局。
例如:
test.setLayout(new BoxLayout(test, BoxLayout.Y_AXIS));
//test.setPreferredSize(new Dimension(200, 100));
scrollPane.setPreferredSize(new Dimension(200, 180));
我还找到了 this code that resolves the problem of vertical stacked components. And this one。
我知道您希望按钮换行,因此您将它们添加到使用 FlowLayout
布局管理器的 JPanel
。我还了解到您希望包含这些按钮的 JPanel
滚动。我通过设置包含按钮的 JScrollPane
和 JPanel
的首选大小来实现这一点,如下面的代码所示。
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.Arrays;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;
public class BtnScrl implements Runnable {
public void run() {
showGui();
}
private void showGui() {
JFrame frame = new JFrame("BtnScrl");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(createButtons());
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JScrollPane createButtons() {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(400, 290));
for (String tag : Arrays.asList("one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
"ten",
"012",
"qwer",
"z<xc",
"rty",
"poiu",
"gfj",
"zxcv",
"mjnb",
"mko",
"nij",
"bhu")) {
panel.add(new JButton(tag));
}
JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.setPreferredSize(new Dimension(400, 100));
return scrollPane;
}
public static void main(String[] args) {
EventQueue.invokeLater(new BtnScrl());
}
}
这是 运行 应用程序的屏幕截图。