javafxにて別のAnchorPaneの操作

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ビブロ

javafxにて別のAnchorPaneの操作

#1

投稿記事 by ビブロ » 7年前

こんばんは、現在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の操作

#2

投稿記事 by ビブロ » 7年前

申し訳ありません、間違えて送信押してしまいました。書き直します。

ビブロ

Re: javafxにて別のAnchorPaneの操作

#3

投稿記事 by ビブロ » 7年前

こんばんは、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の操作

#4

投稿記事 by と成りのトトロ » 7年前

javaFXとJavaFX Scene Builder 2.0[VS2015の様なGUI入力](とeclipse)がインストール完了しました。コードを試してみたいと思います。
ルールhttp://dixq.net/board/board.htmlに則って環境と経緯の詳細を書き記してください。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: javafxにて別のAnchorPaneの操作

#5

投稿記事 by YuO » 7年前

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の操作

#6

投稿記事 by ビブロ » 7年前

と成りのトトロ さんが書きました: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の操作

#7

投稿記事 by ビブロ » 7年前

YuO様ありがとうございます。
アドバイスを元に実装してみます。進捗があればまた報告致します。

ビブロ

Re: javafxにて別のAnchorPaneの操作

#8

投稿記事 by ビブロ » 7年前

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]
となり型の不一致が起こります。インスタンスはクラスの実体という事は分かります。
インスタンスに対してインスタンスを渡すという処理について詳しく説明頂けると幸いです。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: javafxにて別のAnchorPaneの操作

#9

投稿記事 by YuO » 7年前

ビブロ さんが書きました:
mainCon#melodycreatewindowの中でcreatemelodyconクラスのインスタンスに対して,自身のインスタンスを渡しておいて
createmelodyconクラスのインスタンスに対して,自身のインスタンスを渡すという処理についてなのですが、文章をそのまま起こすと
mainConクラスの非staticメソッドの中なのですから,自身のインスタンスはthisです。
newしたものは自身とは異なるインスタンスです。

また,createmelodyconクラスのインスタンスも単純にnewすればよい,というものではないです。
例えば,FXMLLoader#getControllerでインスタンスを取得する必要がありますし,
値を渡すというのも代入する事を意味するのではなく,受け取るためのメソッドをcreatemelodyconクラスに定義して(値を引数に)mainCon#melodycreatewindowから呼び出す,ということを言っています。

ビブロ

Re: javafxにて別のAnchorPaneの操作

#10

投稿記事 by ビブロ » 7年前

返信ありがとうございます。
頂いたアドバイスを元に以下のように組んでみました(宣言等省略)

コード:

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){

		}



}

ここまではこの書き方で合っているでしょうか?

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: javafxにて別のAnchorPaneの操作

#11

投稿記事 by YuO » 7年前

最初の回答にも書いた通り,JavaFXについては詳しくありませんが,
ビブロ さんが書きました:ここまではこの書き方で合っているでしょうか?
コードの仕組みとしては合っていると思います。

JavaFXの世界における標準的な書き方かどうかはわかりません。

ビブロ

Re: javafxにて別のAnchorPaneの操作

#12

投稿記事 by ビブロ » 7年前

返信ありがとうございます。
この質問の目的である別の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の操作

#13

投稿記事 by ビブロ » 7年前

只今解決致しました。
先程の[①何かの宣言]の所にmainConのインスタンスを宣言した所、無事に動作しました。
ここで宣言したmethod()は言わばセッターの役割をしているんですね。

YuO様本当にありがとうございます。お世話になりました。

Math

Re: javafxにて別のAnchorPaneの操作

#14

投稿記事 by Math » 7年前

[雑談]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

Math

Re: javafxにて別のAnchorPaneの操作

#15

投稿記事 by Math » 7年前

[雑談]
[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が違うと動作が異なる。

Math

Re: javafxにて別のAnchorPaneの操作

#16

投稿記事 by Math » 7年前

[訂正][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."

閉鎖

“C言語何でも質問掲示板” へ戻る