我正在尝试使一个JFrame
出现,该将文本文件中的每一行读取到JLabel
中,并将JLabel
放入JScrollPane
中,然后将该JScrollPane
添加到我的窗口的容器中。内容和标签已加载,但有一个问题,一旦窗口加载,我的JScrollPane
就会向上并拉出Container
给我留下一个空白窗口。有什么帮助吗?这是代码:
import java.awt.Container;
import java.util.Scanner;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
public class Helper extends JFrame{
String filepath = "assets/help.txt";
Scanner reader;
Container contentpane;
JScrollPane scrp = new JScrollPane(null);
JLabel line = new JLabel();
int align_x, align_y;
int window_width = 700;
int window_height = 700;
public Helper(){
setSize(window_height,window_width);
setVisible(true);
setTitle("Electric Force Calculator Helper");
scrp.setSize(window_height,window_width);
scrp.setVisible(true);
contentpane = getContentPane();
reader = new Scanner(getClass().getResourceAsStream(filepath));
align_x = 10;
align_y = 10;
while(reader.hasNextLine()){
line = new JLabel(reader.nextLine());
line.setBounds(align_x,align_y,window_width,20);
scrp.add(line);
align_y+=20;
}
contentpane.add(scrp);
}
public static void showHelpFrame(){
Helper newHelper = new Helper();
}
}
line = new JLabel(reader.nextLine());
您每次都在此处创建一个新标签,然后将该标签添加到JScrollPane
中的另一个标签上,
scrp.add(line);
更好的方法是使用 JList
,将JList
包装在JScrollPane
中,然后用文本行填充列表的数据模型。
DefaultListModel<String> lines = new DefaultListModel<String>();
JList l = new JList(lines);
JScrollPane scrp = new JScrollPane(l);
while(reader.hasNextLine()) {
lines.addElement(reader.nextLine());
}
是的,不要使用 JLabel。使用 JList。或者,先将所有 JLabels 添加到单独的 JPanel 中,然后将其添加到 JSCrollPane。
我有一些建议要给你。
-
对变量使用更多用户友好名称(这些名称很小。你真的需要使用下划线,而不是使用骆驼大小写吗?反正由你决定)
-
即使在完成最简单的 GUI 之前,也不要设置所有可见的内容。尽可能在构造函数的末尾做可见的东西
-
您正在扩展 JFrame。因此,使其可见。在这里,你已经打电话setVisible(true) 也到 JScrollPane 上,这不是必需的。
-
调用getContentPane的最简单方法是getContentPane().add(stuff)。无需为此创建单独的变量。
-
初始化构造函数内的变量。在此之前,它不是一切。这是可能的,但这并不意味着它可以。