我正在尝试显示JFrame
,将文本文件中的每一行读取到JLabel
,并将JLabel
放入JScrollPane
,JScrollPane
然后将1}}添加到我的窗口的Container中。内容和标签已加载,但有一个问题,只要窗口加载我的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();
}
}
答案 0 :(得分:1)
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());
}
中,然后使用您的文本行填充列表的数据模型。
{{1}}
答案 1 :(得分:1)
是的,不要使用JLabel。使用JList。或者,首先将所有JLabel添加到单独的JPanel,然后将其添加到JSCrollPane。
我有一些建议可以给你。
为变量使用更多用户友好名称(这些名称很小。你真的需要使用下划线,而不是使用骆驼案吗?无论如何都取决于你)
即使在使用最简单的GUI之前,也不要将所有内容都设置为可见。尽可能在构造函数的末尾做可见的东西
您正在扩展JFrame。所以,让它可见。在这里,你已经打电话了 setVisible(true)也是JScrollPane,这是没有必要的。
调用getContentPane的最简单方法是getContentPane()。add(stuff)。无需为此创建单独的变量。
在构造函数中初始化变量。不是在那之前,把它排除在一切之外。这是可能的,但这并不意味着它没问题。