1

windowbuilderを使用して3つのGUIフレームを作成し、この順序でロードおよび表示します。

  • 1番目のGUI(Home.java)
  • 2番目のGUIと3番目のGUI(Results1.java、Results2.java)

明らかに、Home.javaを最初にロードできますが、後続の2つのGUIはHome.javaと同時にロードされます。GUIの要素を初期化するメソッド内に印刷構文を挿入したので、それを確認できます。Home.javaのボタンを押した後、最後の2つのGUIを表示できますが、コンテンツはすでにロードされています。したがって、これら2つのGUIに変数を渡す必要がある場合、値はnullになります。何か案は?

Home.Javaボタンが押されました。

//Compare Button
            btnCompare.addActionListener(
                        new ActionListener() {
                        public void actionPerformed(ActionEvent e) {

                            if(lbl_filecontainer1.getText() != "No File" && lbl_filecontainer2.getText() != "No File")
                            {

                                    r1.setFileName1(lbl_filecontainer1.getText());
                                    r1.Launch();
                            }
                            else if (lbl_filecontainer1.getText() == "No File" && lbl_filecontainer2.getText() != "No File")
                            {
                                JOptionPane.showMessageDialog(null, "No file 1 selected");
                            }
                            else if (lbl_filecontainer1.getText() != "No File" && lbl_filecontainer2.getText() == "No File")
                            {
                                JOptionPane.showMessageDialog(null, "No file 2 selected");
                            }
                            else
                                JOptionPane.showMessageDialog(null, "No files selected");
                            }

                      }
                    );

Results1.java

public class Results1 {

private JFrame frmFileOverall;
String FileName1;

//Instances
Database db = new Database();

/**
 * Launch the application.
 */
public void Launch(String FileName) {
            try {
               setFileName1(FileName);
                Results1 window = new Results1();
                window.frmFileOverall.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }

}

/**
 * Create the application.
 */
public Results1() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frmFileOverall = new JFrame();
    frmFileOverall.setResizable(false);
    frmFileOverall.setTitle("File 1 overall result");
    frmFileOverall.setBounds(100, 100, 550, 450);

    JLabel lblNewLabel = new JLabel("Number of words: ");
    lblNewLabel.setFont(new Font("Verdana", Font.BOLD, 11));

    JLabel lblNumberOfSentences = new JLabel("Number of sentences: ");
    lblNumberOfSentences.setFont(new Font("Verdana", Font.BOLD, 11));

    JLabel label_1 = new JLabel("Number of paragraphs: ");
    label_1.setFont(new Font("Verdana", Font.BOLD, 11));

    JTextArea txtAreaFile1 = new JTextArea();
    txtAreaFile1.setEditable(false);

    JLabel wordsContainerFile1 = new JLabel("New label");

    JLabel sentencesContainerFile1 = new JLabel("New label");

    JLabel paragraphsContainerFile1 = new JLabel("New label");
    GroupLayout groupLayout = new GroupLayout(frmFileOverall.getContentPane());
    groupLayout.setHorizontalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(groupLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                    .addComponent(txtAreaFile1, GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE)
                    .addGroup(groupLayout.createSequentialGroup()
                        .addComponent(lblNewLabel, GroupLayout.PREFERRED_SIZE, 124, GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addComponent(wordsContainerFile1))
                    .addGroup(groupLayout.createSequentialGroup()
                        .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                            .addComponent(label_1)
                            .addComponent(lblNumberOfSentences, GroupLayout.PREFERRED_SIZE, 151, GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                            .addComponent(paragraphsContainerFile1)
                            .addComponent(sentencesContainerFile1))))
                .addContainerGap())
    );
    groupLayout.setVerticalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(groupLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                    .addComponent(lblNewLabel)
                    .addComponent(wordsContainerFile1))
                .addPreferredGap(ComponentPlacement.RELATED)
                .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                    .addComponent(lblNumberOfSentences)
                    .addComponent(sentencesContainerFile1))
                .addPreferredGap(ComponentPlacement.RELATED)
                .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                    .addComponent(label_1)
                    .addComponent(paragraphsContainerFile1))
                .addPreferredGap(ComponentPlacement.RELATED)
                .addComponent(txtAreaFile1, GroupLayout.DEFAULT_SIZE, 322, Short.MAX_VALUE)
                .addContainerGap())
    );
    frmFileOverall.getContentPane().setLayout(groupLayout);
    System.out.print(getFileName1());
    //txtAreaFile1.setText(db.loadFile(getFileName()));
}

public void setFileName1(String fileName)
{
    this.FileName1 = fileName;
}

public String getFileName1()
{
    return this.FileName1;
}


}
4

1 に答える 1

3

ボタンを押すだけで作成済みの結果GUIを表示するのではなく、ボタンが押されたときにのみ結果GUIを作成しませんか。つまり、結果作成コードをHome JButtonのActionListenerから呼び出しますか?要約すると、重要なのは結果GUIをいつどのように作成するかであり、プログラムの開始時に、ユーザーからのイベントに応答して作成する必要があるときにこれを行うようです。

ここにいる多くの人は、私も含めて、ユーザーに異なるウィンドウを撮影する代わりに、GUIのビューとして1つのJFrameのみを使用し、CardLayoutを使用してこのビューのJPanelsを変更することを推奨していることに注意してください。また、ここの多くは、Window Builderなどのコード生成ツールを使用する前に、最初にSwingGUIを手動でコーディングする方法を学ぶことをお勧めします。このようにして、後で使用する場合にコード生成ツールが内部で何をしているのかをよりよく理解し、それらをはるかに簡単に使用できるようになります。


編集1
注、私はあなたが何を意味するのかわかりません:

すでに通常のクラスを使用してGUIを作成しようとしました。まだ同じ問題が発生しています。

「通常のクラスを使用してGUIを作成する」とはどういう意味ですか?それらはすべて通常のクラスです。


編集2あなたのコードは、新しい
Results1 オブジェクトを作成するResults1オブジェクトを持っているという点で少し統合失調症であり、これはあなたが混乱しているところです。最初のResults1オブジェクトをr1A、2番目をr1Bと呼びましょう。私が見ているように、これが起こっていることです:

  • r1Aは、ユーザーがGUIを操作する前に、プログラムの作成時に作成されます。
  • ユーザーが「ホーム」GUIでJButtonを押すと、...
  • r1Aはユーザーから情報を取得し、これを使用してfileNameという文字列を設定します。
  • r1Aは、新しいResults1オブジェクトr1Bも作成します。この新しいオブジェクトには、fileName文字列に関する知識がありません。
  • 次に、r1Aはr1BにJFrame、frmFileOverallを表示するように指示します。これも、r1AのfileName文字列に加えられた変更を認識しません。

私の提案:

  • たった1つのResults1オブジェクトを作成します。
  • あなたがしているようにプログラムの作成時ではなく、ActionListenerコードでボタンが押されたときだけです。
  • Results1にコンストラクターStringパラメーターを指定して、fileNameをそのコンストラクターに渡すことができるようにします。
  • 繰り返しますが、Results1に別のResults1オブジェクトを作成させないでください。
  • 繰り返しになりますが、現時点ではウィンドウビルダーソフトウェアの使用を避け、Java Swingチュートリアルを実行してください。最初にこのコーディングを手作業で行うことができれば、これらすべてが第二の性質になります。

編集3
あなたのコードに関して:

if(lbl_filecontainer1.getText() != "No File" && 
    lbl_filecontainer2.getText() != "No File") {
    // ....

!=またはを使用して文字列を比較する必要はありません。これにより、ある文字列オブジェクトが別の文字列オブジェクト同じである==かどうかがチェックされるため、誤解を招く結果が生じる可能性があります。代わりに、2つのStringオブジェクトに同じテキストが含まれているかどうかを知りたい場合は、Stringメソッドまたは:を使用する必要があります。equals(...)equalsIgnoreCase(...)

if(!"No File".equalsIgnoreCase(lbl_filecontainer1.getText()) && 
    !"No File".equalsIgnoreCase(lbl_filecontainer2.getText())) {
    // ....
于 2012-10-15T20:55:54.443 に答える