1

我正在尝试将JFrame文本文件中的每一行读入 aJLabel并将其JLabel放入 aJScrollPane中,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();
}
}
4

2 回答 2

1

line = new JLabel(reader.nextLine());您每次都在这里创建一个新标签,然后将该标签添加到 with 中的另一个标签JScrollPanescrp.add(line);

更好的方法是使用 a JList,将 a 包裹起来JListJScrollPane然后用您的文本行填充列表的数据模型。

DefaultListModel<String> lines = new DefaultListModel<String>();
JList l = new JList(lines);
JScrollPane scrp =  new JScrollPane(l);

while(reader.hasNextLine()) {
    lines.addElement(reader.nextLine());
}
于 2012-08-08T16:34:23.447 回答
1

是的,不要使用 JLabel。使用 JList。或者,首先将所有 JLabel 添加到单独的 JPanel,然后将其添加到 JSCrollPane。

我有一些建议要给你。

  1. 为变量使用更多用户友好的名称(这些名称很小。你真的需要使用下划线,而不是使用驼峰式大小写吗?这取决于你)

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

  3. 您正在扩展 JFrame。所以,让它可见。在这里,您也调用了 JScrollPane 的 setVisible(true),这不是必需的。

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

  5. 在构造函数中初始化变量。不是在那之前,把它排除在一切之外。这是可能的,但这并不意味着它没问题。

于 2012-08-08T16:51:29.933 回答