1

JFrameテキスト ファイルから各行を に読み取り、それを に配置するように表示させよJLabelうとしています。これは、ウィンドウのコンテナに追加されます。コンテンツとラベルは読み込まれますが、1 つの問題があります。ウィンドウが読み込まれるとすぐにジッパーが開いて、空白のウィンドウが残ります。何か助けはありますか?コードは次のとおりです。 JLabelJScrollPaneJScrollPaneJScrollPaneContainer

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());ここで毎回新しいラベルを作成し、そのラベルをJScrollPanewithの他のラベルに追加します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());
}
于 2012-08-08T16:34:23.447 に答える
1

はい、JLabel を使用しないでください。J リストを使用します。または、最初にすべての JLabels を個別の JPanel に追加してから、JSCrollPane に追加します。

いくつかアドバイスがあります。

  1. 変数には、より使いやすい名前を使用してください (これらの名前は小さいです。本当にキャメル ケースではなくアンダースコアを使用する必要がありますか? とにかく、それはあなた次第です)

  2. 最も単純な GUI を使用する前であっても、すべてを可視に設定しないでください。可能な限り、コンストラクターの最後で目に見えるものを実行します

  3. JFrame を拡張しています。だから、それを見えるようにします。ここでは、setVisible(true) を JScrollPane にも呼び出していますが、これは必要ありません。

  4. getContentPane を呼び出す最も簡単な方法は、getContentPane().add(stuff) です。そのために別の変数を作成する必要はありません。

  5. コンストラクタ内の変数を初期化します。その前ではなく、すべてを脇に置きます。可能ですが、それでOKというわけではありません。

于 2012-08-08T16:51:29.933 に答える