ページ 1 / 1
javafxにて別のAnchorPaneの操作
Posted: 2017年1月17日(火) 04:56
by ビブロ
こんばんは、現在javaFXにて1つ目のAnchorPaneのテキストフィールドを2つ目のAnchorPaneのテキストフィールドに書き出す処理がしたいのですが上手くいきません。
これがメインクラスです。
[codeJavaFX]
public class Main extends Application{
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("MainScreen.fxml"));
AnchorPane root = loader.load();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args){
launch(args);
}
}
[/code]
そしてこれがMainScreen.fxmlのコントローラーです。MainScreen.fxmlはAnchorPaneにテキストフィールドが置いてあるだけです。
コード:
public class mainCon implements Initializable{
@FXML
TextArea textArea;
}
[code]
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月17日(火) 04:57
by ビブロ
申し訳ありません、間違えて送信押してしまいました。書き直します。
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月17日(火) 05:57
by ビブロ
こんばんは、javaFXにて1つ目のAnchorPaneのテキストエリアに2つ目のAnchorPaneのテキストエリアの内容を書き出す処理がしたいのですがエラーが発生します。
これがメインクラスです。
[codeJavaFX]
package application;
public class Main extends Application{
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("MainScreen.fxml"));
AnchorPane root = loader.load();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args){
launch(args);
}
}
[/code]
そしてこれがMainScreen.fxmlのコントローラーです。MainScreen.fxmlはAnchorPaneにテキストエリアと、もう一つのAnchorPaneを開くボタンが置いてあるだけです。
[codeJavaFX]
package application;
public class mainCon implements Initializable{
@FXML
TextArea textArea;
@FXML
Button button;
@Override
public void initialize(URL location, ResourceBundle resources) {
}
public void test(String melody){
textArea.appendText(melody);
}
//ボタンが押されたら実行
//ウィンドウを生成
@FXML
public void melodycreatewindow() throws IOException{
Stage stage = new Stage();
FXMLLoader loader = new FXMLLoader(getClass().getResource("subwindow.fxml"));
loader.load();
Parent root = loader.getRoot();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
}
[/code]
そして以下がsubwindow.fxmlのコントローラーです。subwindow.fxmlはAnchorPaneにテキストエリアと、MainScreen.fxmlのテキストエリアに書き出すボタンがあります。
[codeJavaFX]
package application;
public class createmelodycon implements Initializable{
@FXML
TextArea textarea;
@FXML
Button button;
@Override
public void initialize(URL location, ResourceBundle resources) {
}
//ボタンが押された時に実行
@FXML
public void sendmelody(){
mainCon con = new mainCon();
con.test(textarea.getText());
}
}
[/code]
このようにして書き実行し、subwindowを開いてテキストエリアに文字を入力、ボタンを押すと以下のようなエラーがでます。
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1770)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1653)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8390)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3758)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3486)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2495)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:350)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$350(GlassViewEventHandler.java:385)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$$Lambda$204/1399154129.get(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:404)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:384)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:927)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$145(WinApplication.java:101)
at com.sun.glass.ui.win.WinApplication$$Lambda$36/2117255219.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1767)
... 50 more
Caused by: java.lang.NullPointerException
at application.SampleController.test(MainScreen.java:18) ←textarea.appendText(melody);の所
at application.SampleController2.action(createmelodycon.java:14) ←con.test(textarea.getText());の所
... 60 more
恐らくsubwindowを開いた事によりMainScreenが背面に移動し操作不可状態になっているのだと思います・・・。その場合の解決方法も分かりません。
何か解決法があればご教授ください。
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月17日(火) 22:53
by と成りのトトロ
javaFXとJavaFX Scene Builder 2.0[VS2015の様なGUI入力](とeclipse)がインストール完了しました。コードを試してみたいと思います。
ルール
http://dixq.net/board/board.htmlに則って環境と経緯の詳細を書き記してください。
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月18日(水) 01:02
by YuO
JavaFXには詳しくないですが……。
ビブロ さんが書きました:コード:
Caused by: java.lang.NullPointerException
at application.SampleController.test(MainScreen.java:18) ←textarea.appendText(melody);の所
at application.SampleController2.action(createmelodycon.java:14) ←con.test(textarea.getText());の所
... 60 more
なので,このあたりを探ると,そもそも,
ビブロ さんが書きました:コード:
public void sendmelody(){
mainCon con = new mainCon();
con.test(textarea.getText());
}
と、mainConクラスの新しいインスタンスを作ってしまっていますが、これは正しいのでしょうか。
元々のウィンドウ(に対応するクラスである)mainConクラスを使いたいのであれば,mainCon#melodycreatewindowの中でcreatemelodyconクラスのインスタンスに対して,自身のインスタンスを渡しておいて,
createmelodycon#sendmelodyの中ではmainConクラスの新しいインスタンスではなく,渡されたインスタンスを使う必要があるのではないでしょうか。
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月18日(水) 03:25
by ビブロ
と成りのトトロ さんが書きました:javaFXとJavaFX Scene Builder 2.0[VS2015の様なGUI入力](とeclipse)がインストール完了しました。コードを試してみたいと思います。
ルール
http://dixq.net/board/board.htmlに則って環境と経緯の詳細を書き記してください。
返信ありがとうございます。
OS:windows10pro
環境:Eclipse 4.4 Scene Builder 2.0
です。
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月18日(水) 03:32
by ビブロ
YuO様ありがとうございます。
アドバイスを元に実装してみます。進捗があればまた報告致します。
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月18日(水) 05:46
by ビブロ
mainCon#melodycreatewindowの中でcreatemelodyconクラスのインスタンスに対して,自身のインスタンスを渡しておいて
createmelodyconクラスのインスタンスに対して,自身のインスタンスを渡すという処理についてなのですが、文章をそのまま起こすと
[codeJavaFX]
@FXML
public void melodycreatewindow() throws IOException{
MainScreen ms = new MainScreen(); //自身のインスタンス
createmelodycon con = new createmelodycon(); //createmelodyconクラスのインスタンス
con = ms; //createmelodyconクラスのインスタンスに対して,自身のインスタンスを渡す・・・?
Stage stage = new Stage();
FXMLLoader loader = new FXMLLoader(getClass().getResource("subwindow.fxml"));
loader.load();
Parent root = loader.getRoot();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
[/code]
となり型の不一致が起こります。インスタンスはクラスの実体という事は分かります。
インスタンスに対してインスタンスを渡すという処理について詳しく説明頂けると幸いです。
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月18日(水) 10:59
by YuO
ビブロ さんが書きました:mainCon#melodycreatewindowの中でcreatemelodyconクラスのインスタンスに対して,自身のインスタンスを渡しておいて
createmelodyconクラスのインスタンスに対して,自身のインスタンスを渡すという処理についてなのですが、文章をそのまま起こすと
mainConクラスの非staticメソッドの中なのですから,自身のインスタンスはthisです。
newしたものは自身とは異なるインスタンスです。
また,createmelodyconクラスのインスタンスも単純にnewすればよい,というものではないです。
例えば,FXMLLoader#getControllerでインスタンスを取得する必要がありますし,
値を渡すというのも代入する事を意味するのではなく,受け取るためのメソッドをcreatemelodyconクラスに定義して(値を引数に)mainCon#melodycreatewindowから呼び出す,ということを言っています。
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月19日(木) 20:54
by ビブロ
返信ありがとうございます。
頂いたアドバイスを元に以下のように組んでみました(宣言等省略)
コード:
public class mainCon {
public void test(String melody){
textarea.appendText(melody);
}
//ボタンが押されたら実行
//ウィンドウを生成
@FXML
public void action() throws IOException{
Stage stage = new Stage();
FXMLLoader loader = new FXMLLoader(getClass().getResource("subwindow.fxml"));
loader.load();
Parent root = loader.getRoot();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
createmelodycon san = loader.getController(); //createmelodyconクラスのインスタンス
san.method(this); //createmelodyconクラスのインスタンスに対して,自身のインスタンスを渡す
}
}
コード:
public class createmelodycon{
@FXML
public void sendmelody(){
//渡されたインスタンスを使う?
}
//受け取る為のメソッドをcreatemelodyconクラスに定義(値を引数に)mainCon#melodycreatewindowから呼び出す
public void method(SampleController a){
}
}
ここまではこの書き方で合っているでしょうか?
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月21日(土) 04:07
by YuO
最初の回答にも書いた通り,JavaFXについては詳しくありませんが,
ビブロ さんが書きました:ここまではこの書き方で合っているでしょうか?
コードの仕組みとしては合っていると思います。
JavaFXの世界における標準的な書き方かどうかはわかりません。
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月22日(日) 09:44
by ビブロ
返信ありがとうございます。
この質問の目的である別のAnchorPaneのテキストエリアへの出力ですが、考え方は以下でよろしいでしょうか?
コード:
public class createmelodycon{
//①何かの宣言(仮に名前をxxとする)
@FXML
public void sendmelody(){
xx.test(textarea.getText()); //受け取ったインスタンスを使用
}
//受け取る為のメソッドをcreatemelodyconクラスに定義(値を引数に)mainCon#melodycreatewindowから呼び出す
public void method(SampleController a){
this.xx = a; //自分のクラスで宣言したxxに受け取ったインスタンスを入れる
}
}
もしもこの考え方で合っている場合、①の何かの宣言では何を宣言すればいいのでしょう?インスタンスを格納できる型はあるのでしょうか?
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月22日(日) 09:58
by ビブロ
只今解決致しました。
先程の[①何かの宣言]の所にmainConのインスタンスを宣言した所、無事に動作しました。
ここで宣言したmethod()は言わばセッターの役割をしているんですね。
YuO様本当にありがとうございます。お世話になりました。
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月22日(日) 20:05
by Math
[雑談]
javaFXの概要がわかりました。
「Eclipse 4.6 Neon[英語版]のみで作ったjavaFXプログラム」(..且つ、FXMLのサポートがつく"e(fx)clipse"プラグインを入れる。
http://csi.nisinippon.com/javafx01.png
「Scene Builder 2.0(JavaFX8のデザインをGUIで作成する)[1.0とは全く違うので注意]
http://csi.nisinippon.com/javafx02.png
「NetBeans IDE 8.2---Servlet---」
http://csi.nisinippon.com/javafx03.png
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月22日(日) 20:12
by Math
[雑談]
[java]版 [WFP]です。FXMLがxamlに相当する。「Scene Builder 2.0」がVS2015IDE(CommunityではBlend)に相当。(2016 年 5 月時点で”Java 8/JavaFX 8 の内容は .NET Framework 4.0 相当と考えてよいと思います”よのことです。)JavaはMac,Linuxにも対応。
主なマニュアルは、次の 4 つです。
---------------------------------------------------------
Java SE 8 API
---------------------------------------------------------
NET Framework のクラスライブラリに相当するもので、Java 全般のクラスライブラリです
。ちなみに、SE は、"Standard Edition" の略です。日本語にすると、
「標準版」とでもなるのでしょうが、標準でない版があるのかどうかは分かりません。
---------------------------------------------------------
JavaFX 8 API
---------------------------------------------------------
WPF のクラスライブラリに相当するもので、ファイルの I/O のような Java の基本的な機能に関係するクラスは含みません。
---------------------------------------------------------
JavaFX 8 Documentation
---------------------------------------------------------
JavaFX のプログラミングガイド、つまり、JavaFX 関係の API の使い方を解説するものです。
---------------------------------------------------------
JavaFX 8 Tutorials
---------------------------------------------------------
"tutorial" は、[取扱説明書]です。[指導書とか解説書]、あるいは[チュートリアル]
[補足的なマニュアル]
1.JavaFX CSS Reference Guide
----------------------------
2.Introduction to FXML
----------------------------
3.Lambda Expressions in Java 8
-------------------------------
4.Concurrency in JavaFX
-----------------------------
5.Java File I/O (NIO.2)
-----------------------------
---///「ある記事より」///---
実際に使ってみたらSwingよりも思いのほか簡単だった。
[JavaFXのSwingに対して以下のようなメリット]。
FXMLを使うことによりUIのレイアウト構造をコードから分離することができる ?
---------------------------------------------------------------------------
Swingではロジックとレイアウトがごちゃまぜになっていて、作るのは良いが、修正する
場合に困難が伴わなかったことがない。
その点、JavaFXはコードではレイアウトしないので保守性が高そうである。
----------------------------------------------------------------------------
FXMLはXML構造であるため、GUIのようなオブジェクトツリー構造を記述するのに適している ?
---------------------------------------------------------------------------------------
XMLであるためツールとの親和性が高い。(Scene Builderという外部ツールでレイアウトを編集できる。)
-----------------------------------------------------------------------------------------------
スキーマレス(なんでもあり)のXMLである。
----------------------------------------
(それによりカスタムコンポーネントなどの新しい要素も制限なく取り入れられる)
やってることも、実は単純だったりする。(手で作るのも難しくないと思われる。やりたくはないけど。)
--------------------------------------------------------------------------------------------------
バインディングはめんどくさい反面、とても便利で強力だったりする。
---------------------------------------------------------------------
CSSによる細かなレイアウトの調整やデコレーションが、プログラムコードとは分離して表現できる。
----------------------------------------------------------------------------------------------
(ただしウェブ的なcssとは、ちょっと違う。)
------------------------------------------
とのことです。
**サンプルも豊富にみつかったので以外に簡単かも知れません。フリーソフトなのでMSDN のように正確な資料
はなくVersionが違うと動作が異なる。
Re: javafxにて別のAnchorPaneの操作
Posted: 2017年1月22日(日) 20:58
by Math
[訂正][WFP]は[WPF]の誤りでした。
「参考」
WPF とは何かに対する Microsoft の答えは、Visual Studio 2008 のヘルプの「Windows Presentation Foundation の概要」(Visual Studio 2010 の場合は、「WPF の概要)の項にある以下の文章の中にあります。
「Windows Presentation Foundation (WPF) は、魅力的な外観のユーザーエクスペリエンスを持つ Windows クライアントアプリケーションを作成するための次世代プレゼンテーションシステムです。」
原文は
"Windows Presentation Foundation (WPF) is a next-generation presentation system for building Windows client applications with visually stunning user experiences."