えっと前回は。。。GUIを作ってclientの作成は、まだしてないのかな?
で、今回はコントローラーのあたりを作成します。
コントローラーはイニシャライザーを継承しておきます
で、今回はclient側も少しコードをかきます
必要クラスは
client.Client.class
client.GUI.MainController.class
です
イニシャライズのコードはめんどくさいのでカット
最後にソースのリンクを貼ります
で、今回はまずタイトルの追加ダイアログの作成です。
タイトルというのは

このGUIの更新ボタンの左側のコンボボックスにストーリーリストを取得するタイトル(漫画名とid)のアイテムです
漫画idというのは

この漫画URLの右にあるNo=より先の数値です
これはjava.util.Propertiesで漫画名とidで保存させます
注意:すべての解説はしません。あくまでメインのシステム重視です
では、まずFXによるダイアログの作成ですが...
FXにはSwingのようなダイアログクラスは存在しません。ではどうするか。
また、コンボボックスにはボタンの要素はありません。あくまでコンボボックスの選択が変更された場合にアクションが渡されるだけです。
まずItemクラスを作成します。
public class Item {
private String name;
private String id;
private boolean isAddItem
public Item(String name,String id,boolean isadditem){
this.name = name;
this.id = id;
this.isAddItem = isadditem;
}
@Override //---toStringのオーバーライド。ここで返されるStringがコンボボックスでの表示名
public String toString() {
return this.name;
}
こんな感じかな?ちなみにsetterとgetterは含んでません。
Itemクラス全コードはこちら
そしてコンボボックスのインスタンスは
@FXML
ComboBox<Item> com;
とできます
で、もうわかりますね?
ComboBoxからgetValueメソッドを呼び出して選択されたItemインスタンスを取得します。
そしてそのItemのisAddItemの値を見てあげてtrueだったらダイアログを開くと。
で、次にダイアログの処理です。
まずダイアログを作成します。
新しいFXMLを作成して
作成して...
レイアウトします
こんな感じですね。
FXMLのコードはこちら
ダイアログのコントローラーのコード
で、メインGUIのアクションイベントメソッドの作成
private void comboAction(ActionEvent e){
Item select = combo.getValue();//選択アイテムの取得
if(select.isAdd){
if(client.showAddNameDialog(select)) name.add(new Item("追加",true));
}
となります
中でclienr.showAddNameDialogを呼び出しています。clientはクライアントのインスタンスが入っています。
で、クライアント側のコードは
public boolean showAddNameDialog(Item item) {
try{
FXMLLoader fxml = new FXMLLoader(ADD_NAME_DIALOG_FXML);//FXMLローダーの作成
fxml.load();//ロード
Parent root = fxml.getRoot();//FXMLからパネルの取得
AddNameDialog con = fxml.getController();//コントローラーの取得
Scene sc = new Scene(root);//シーンの作成
Stage stage = new Stage(StageStyle.UTILITY);//ステージの作成
//------------------------------------------------------ステージのセットアップ
stage.setScene(sc);
stage.initOwner(win);
stage.initModality(Modality.WINDOW_MODAL);
stage.setTitle("タイトルを追加");
con.setStage(stage);//コントローラーにステージを渡す
stage.showAndWait();//ウィンドウを表示し閉じられるまで待機
//*************************************************追加できるかのチェック
if(con.getName().equals("")) {
return false;
}else if(!idPro.containsKey(con.getName())){ //------------------------------------------------------アイテムの書き換え
item.setName(con.getName());
item.setId(con.getID());
item.setAdd(false);
addURLPro(con.getName(), con.getID());
return true;
}else{
return false;
}
} catch (IOException e){
e.printStackTrace();
}
reyirn false;
}
と、なっています。
コード全文はこちら
MainController.java
Client.java
で、解説
まずFXMLファイルをロードしてコントローラーとパネルを取得します。
そのパネルからシーンを作成してステージを作成してそこに追加(言い方(笑))
ステージにinitOwnerで渡しているのは親となるウィンドウです。
どこから持ってきているかはコードを読めばわかると思います。
ヒントはMainControllerのcomboActionです。
そしてステージのinitModalityをWINDOW_MODALにセットしています
これは自身の親子系列にある自分以外のウィンドウへの入力をブロックします。
つまり、そのウィンドウが閉じられるまでメインGUIへのアクセスはできなくなります。
そのあと、コントローラーにステージを渡しているのは、コントローラーからウィンドウを閉じるためのものですが、じつはこれ、渡さなくても向こうのコントローラーでWindowを取得してhideでいいんですよね。なぜならhideとcloseは同じとドキュメントに記載されているので。
これはSwingの癖です。Swingの場合、setVisible(false)(Swingでいうhide、ウィンドウを隠すだけ。)をしてもウィンドウは生きていて完全に閉じるにはdisposeをしなくてはいけなかったんです。
なのでその癖ですね(笑)hideじゃなくてdis...無い!!あ、Closeかな?って(笑)
ま、バージョンアップで修正しときましょう。
で、showAndWaitは、そのウィンドウを表示させ、そこの処理を一時停止させ、閉じられたとき再開します。
ということは、SwingのDialogみたいな動作ができるわけです。
で、そのあとは、名前に不正があった場合はじくようにして。
なぜ既在のItemを書き換えているのか。
最初はその前に1つその名前のItemを追加してSelectをそっちに変更させてましたがなぜか例外が発生するんです。
なので、書き換えて新しく追加ボタンを下に追加しているのです。
っと、かなり長くなりましたね。
まだいろいろ問題ありますが、地道に完成させていきます。


