1

ユーザーがボタンをクリックしてテキストファイルの内容を表示できるGUIがあります。問題は、ファイルがかなり大きく(100,000行以上のデータ)、テーブルの読み取りと表示に15秒以上かかる可能性があることです。

テキストファイルの形式の例:

*/
    Account ID     : 8 digit number
    Money Charged  : Integer < $10
    Values separated by \t 

/*


Account Id    Money Charged
----------    --------------
731298        3
359412        5
624937        1

したがって、ボタンがクリックされると、各行が読み取られ、各IDがマップに配置され、アカウントの料金が増加します。

完了すると、情報を含むJDialog内にJTableが配置されます。ただし、ボタンがクリックされるとすぐに、JDialogとJTableが表示されるまでに10〜15秒以上の遅延が発生したため、ユーザーはプログラムの動作について混乱する可能性があります。

では、JDialogを文字列とともに表示して、テーブルを作成していることをユーザーに知らせる方法はありますか?(またはなどのJDialogメソッドの1つを使用して実行されると思いましたrepaint()validate、それらはうまくいかなかったようです。

これが私がそれがなされるべきだと思っている順序です:

//Psuedo-code
actionPerformed {
    create frame
    display label that lets user know its creating table
    read text file
    create map and place values
    remove label
    update dialog with table // unsure what to do to update it properly
}

したがって、私の全体的な質問は単純です。 現在データを計算していることをユーザーに通知し(JDialogのJLabelを介して)、データが読み取られたら、(JDialogを更新して)JTableを表示することはできますか?

必要に応じて、ソースを提供できます。本当に必要かどうかはわかりませんが

編集

public void actionPerformed(ActionEvent event) {
    JFrame frame = new JFrame();
    JDialog dialog = new JDialog(frame, "Account Charges", true);
    JLabel label = new JLabel("Currently calculating the charges")

    dialog.getContentPane().add(label);       //add waiting label
    dialog.setVisible(true);              
    readData(myFile);                         //read file and create table
    dialog.getContentPane().remove(label);    //waiting label no longer needed
    dialog.getContentPane().add(myJtable);    //update dialog with the table
}
4

3 に答える 3

5

1)I have a Gui which allows the user to click a button and view the contents of a text file.

  • CardLayoutを使用します。すでに表示されているか存在する値の入力/修正/削除のために入力マスクをブロックまたは提供する必要がある場合は、別のコンテナーを作成することをお勧めします。

2)The issue is that the file can be rather large (100,000+ rows of data) and can take upwards of 15 seconds to read and display in a table.

  • 内部リビジョン以外の人は誰も知りません。10万行をチェックまたは操作し、SwingWorkerを使用してFileIOをTableModelに入力し、JTableのページを作成することができます。

3)//疑似コード

actionPerformed {

create frame-JFrameは既存のものを再利用しませんJDialog、確かにもっと良いかもしれませんCardLayout

display label that lets user know its creating table-わからない

read text file-SwingWorkerとJProgressBarを使用して、データを変換してTableModelに配置し、バッチを使用して50行ごとにTableModel feを更新し、JTableのページを探します。そうすると、100kではなく、必要な数の行のみが表示されます。これはおかしなことかもしれません。 :-)

create map and place values-必要なすべての情報をTableModelに格納しているため、役に立たない可能性があります

remove label-わからない

update dialog with table-JtableはSwinWorkerからすぐに更新でき、Swing GUIはすべてのマウスまたはキーボード入力にアクセスでき、待機することも、10〜15秒で遅延することもありません。

}

于 2012-04-11T20:38:28.677 に答える
4

JDialogsあなたが話しているテーブルなどのコンポーネントをそれらの中に保持することができます。JDialog's getContentPaneプログレスバーやラベルなどのコンポーネントを追加/削除するメソッドを使用して、ユーザーに何をしているかを簡単に伝えることができるため、プログラムが機能していることがユーザーに通知されます。

また、私が間違っている場合は訂正してください。ただし、repaint()通常はjava.awtパッケージで使用される方法であり、それほど多くはありませんjavax.swing...特定の場合に限ります。

-別の解決策-ダイアログが開く前に、何が起こっているかをユーザーに伝えることができます。たぶん、GUIまたはプログレスバーに「現在のステータス」ラベルがあります。ファイルが完全に読み取られて使用できるようになったら、ダイアログを開いて、値をテーブルにすばやく投稿できます。

于 2012-04-11T20:33:16.277 に答える
2

ソリューションを使用する最も簡単な方法はlabel.setVisible(false)、操作が完了したときに実行することです。もちろん、ラベルが非表示になったときに他のコンポーネントが適切にサイズ変更/再配置されるように、レイアウトマネージャー(またはその他の優れたフリーデザイン)を作成する必要があります。通常、それは自動的に発生するはずです。

それを行う他の方法がありますが、あなたはそれらを作るのにより多くの時間を費やすでしょう。

于 2012-04-11T20:40:14.183 に答える