Personal Memo: SwingWorker class study note (日本語)

SwingWorkerクラスの使い方

publish() – process()と結びついている

publish()はdoInBackground()の内部で使われるが、process()にデータチャンクを送信する。

SwingWorker<T,V>
T – 結果の型
V – 中間結果の型

processBuildメソッド中で、publish()メソッドが使えない。

publish()はdoInBackground()中で使うメソッド

引数を取る処理をdoInBackground()で行うときどうすればいい?

このサイトを参考にする
http://www.javacreed.com/swing-worker-example/

マルチスレッドで当たり前。
Swingは実質スレッドがいくつかある。

Jaydle開発メモ:JMenuBarの追加、アクションの追加、内部クラスの復習、JFileChooser実装のための知識の整理メモ

とりあえずLibreOffice Writer似とったメモを貼っておく🙃

==========================================================

JMenubarを追加する

frame.setJMenuBar(menubar);//frameはJFrameオブジェクト、munubarはJMenuBarオブジェクト

 簡単 うまくいった

参考サイト

https://www.javadrive.jp/tutorial/jmenu/

・アクションの追加

JMenuItemオブジェクトのメソッド addActionListenerからactionPerformedメソッドを実行する

 内部クラスを使って、メソッドを書く場所は確保した。

  ダウンロードボタンも少し修正した(JFrameActionListenerを実装せずに内部クラスで実装した)Screenshot from 2018-10-23 22-18-21

参考サイト

http://java2008.blog103.fc2.com/blog-entry-43.html

・内部クラスの復習

class ButtonListener implements ActionListener
{

public void actionPerformed(ActionEvent e)

{

strIn=textIn.getText();

if(strIn.length()>13)

dlAudio(strIn);

}

}

・メモ

File、プロセスビルダーの保存ディレクトリ、空白ではエラーが出る

JFileChooserの実装

  • showOpenDialog()showSaveDialog()メソッドと使うのが最も簡単

  • showDialog()も使える

  • 上記のメソッドはそれぞれユーザがどのようにダイアログを終わらせたかを表す整数のステータスコードを返す

  • もし返却された値がAPPROVE_OPTIONならば、ユーザはファイルを選んだ、それはgetSelectedFile()メソッドから得ることができる

オライリーJFCクイックリファレンス(原)より

ダイアログからやったほうがよさげ

P440

JFileChooserはダイアログからできているみたい。だからダイアログをやるといい。

Macみたいにクイックファイルリーダが欲しい。

それにしても、洋ドラの「シリコンバレー」で、リチャード・ヘンドリクスがスティーブ・ジョブズだの、スティーブ・ウォズニアックだの言っていた。Youtubeで検索してこの動画を見ていた。
”Creativity”というもんが伝わった。

Learning About “ActionPerformed” Method And Around “Actions” In JAVA Swing

JFCinanutshellActionListenerインターフェースとactionPerformedメソッドの実行あたりの事柄を整理したいと考えていて、中古で買った洋書を引っ張り出して来て、訳してみました。これはjava.awt.eventに属するみたい。

javax.swing.Action interface

David Flanagan著
JAVA FOUNDATION CLASSES IN A NUTSHELL, A Desktop Quick Reference (O’reilly) 1999, First Edition より

Chapter 3 – Swing Programming Topics – Actions (P26)

JFCtext

GUIソフトはいろんな方法で一つのオペレーションをユーザーにinvoke(呼び出す)ことを許す。
例えば、ユーザーはメニューからでもツールバーからでもファイルをセーブできるだろうし。捜査の結果は極めて同じ。二つの違うインターフェースを介してユーザーに与えられているのだ。

Swingはそのようなオペレーションに関する情報をencapsulate(カプセル化)する単純でパワフルなインターフェースだ。ActionインターフェースはActionListenerインターフェースをextend(継承)するだからActionインターフェースはactionPerformed()メソッドを含む。要求されたアクションを実際に実行するために実装するメソッドはこれである。それぞれのActionオブジェクトはそのアクションに対して追加的な情報を提供する任意の名前/値ペアを持つ。その値は大体以下を含む:そのオペレーションを名付ける短い文字列、グラフィックにそのアクションを表す一つのイメージ、そしてアクションのためのtooltipツールチップ(ふきだし)で使うのに適したより長い文の文字列。加えて、それぞれのActionオブジェクトはひとつのenabledプロパティとenable利用する、disable利用しないということを認可するsetEnabled()メソッドを持つ。(もしあそこでどの文も選択されてないならば、例えば、”切り取り”アクションは通常disableである。)

あなたはひとつのアクションオブジェクトを直接JMenuやJToolBarに追加することができる。あなたがこれをするとき、そのコンポーネントは自動的にそのアクションを表すためのJMenuItemかJButtonを作る、それはそのアクションの捜査をユーザーに対して可能にしそのアクションのテキスト的な描写とグラフィカルなイメージを適切に表示する。

To be continued ..

 

SwingWorkerとProcessBuilderで、順次更新される(フリーズしない)JTextAreaのコーディング:その一

タイトルの通り、「SwingWorkerとProcessBuilderで、順次更新される(フリーズしない)JTextAreaのコーディング」を調べていた。もう二週間くらい前からのゴール。
まずSwingWorkerにたどり着くまでに時間がかかった。

この辺 「JTextAreaで表示が遅れる」(1) Java Solution - @IT会議室

とか見ていて、まずスレッド、まぁ並行プログラミング(Concurrent Programming)とか言われている領域かと思うけど、その辺の知識が必要になった。注1

・イニシャルスレッド
・イベントディスパッチスレッド
・ワーカースレッド

の話題が出てくる。あと

・Runnableインターフェース 注2
・javax.swing.SwingUtilities – invokeLater(Runnable doRun)

とかね。

で、少し勉強しているうちに、SwingWorkerクラスに突き当たった。
スタックオーバーフローさまさま。

システムの(まぁbashか)lsコマンドを再帰的に行って、SwingのJTextAreaに順次表示するプログラムが載っている。
https://stackoverflow.com/questions/20600721/display-indeterminate-jprogressbar-while-batch-file-runs/20603012#20603012

この板でリンクを教えてもらった。
https://stackoverflow.com/questions/45538227/how-do-i-get-the-jtextarea-to-update-with-each-ping

SwingWorkerはジェネリクスを使うし、ActionListenerや、SwingWorkerの継承メソッドの定義やら、GUIを伴って、複数のクラスを使っていて、いろんな要素の絡みがややこしい。

 

注1 並行プログラミングと並列プログラミングを混同していた。並行はConcurrent、並列はParalell

  • 並列(Parallel) : 複数のプロセスで各々のスレッドを同時に処理すること
  • 並行(Concurrent) : 一つのプロセスで複数のスレッドを切り替えながら動作することで、疑似的に複数のスレッドを同時に処理すること
参考サイト
Qiita Javaの並行処理を理解する(入門編)
https://qiita.com/bremen/items/b87bff49565fc9abc91b

注2 Runnableインターフェースのインプリメンテーションをしたクラスを作って、run()メソッドをオーバーライドする。そしてそのインスタンスを生成する、ことあたりがミソのよう。

参考 HeadFirstJava 一版 15章ネットワークとスレッド