JScorllPane文本从窗口飞出



我正在尝试使一个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。

我有一些建议要给你。

  1. 对变量使用更多用户友好名称(这些名称很小。你真的需要使用下划线,而不是使用骆驼大小写吗?反正由你决定)

  2. 即使在完成最简单的 GUI 之前,也不要设置所有可见的内容。尽可能在构造函数的末尾做可见的东西

  3. 您正在扩展 JFrame。因此,使其可见。在这里,你已经打电话setVisible(true) 也到 JScrollPane 上,这不是必需的。

  4. 调用getContentPane的最简单方法是getContentPane().add(stuff)。无需为此创建单独的变量。

  5. 初始化构造函数内的变量。在此之前,它不是一切。这是可能的,但这并不意味着它可以。

相关内容

  • 没有找到相关文章

最新更新