• 締切済み

JavaFXのTreeViewについて

何年か振りでJavaの勉強を再開しました。JavaFXでウィンドウズのエクスプローラみたいなものを作ってみようと始めたのですが、TreeViewにTreeItemが表示されません。 1.まずFXMLは下記の通りです。 <AnchorPane id="AnchorPane" prefHeight="484.0" prefWidth="857.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="km_immagine.FXMLDocumentController"> <children> <BorderPane prefHeight="484.0" prefWidth="857.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <bottom> <Label prefWidth="857.0" text="Label" /> </bottom> <center> <TableView prefHeight="460.0" prefWidth="633.0"> <columns> <TableColumn prefWidth="75.0" text="列X" /> <TableColumn prefWidth="75.0" text="列X" /> </columns> </TableView> </center> <left> <TreeView fx:id="treeView" prefHeight="200.0" prefWidth="200.0" /> </left> <top> <MenuBar> <menus> <Menu mnemonicParsing="false" text="ファイル"> <items> <MenuItem mnemonicParsing="false" text="閉じる" /> </items> </Menu> <Menu mnemonicParsing="false" text="編集"> <items> <MenuItem mnemonicParsing="false" text="削除" /> </items> </Menu> <Menu mnemonicParsing="false" text="ヘルプ"> <items> <MenuItem mnemonicParsing="false" text="バージョン情報" /> </items> </Menu> </menus> </MenuBar> </top> </BorderPane> </children> </AnchorPane> 2.それに対するコントローラは下記の通りです。 public class FXMLDocumentController implements Initializable { @FXML private TreeView<String> treeView; @Override public void initialize(URL url, ResourceBundle rb) { TreeItem<String> rootItem = new TreeItem<>("root"); TreeItem<String> children01 = new TreeItem<>("children01"); rootItem.getChildren().add(children01); this.treeView = new TreeView<>(rootItem); } } 3.で、下記のメインクラスから表示させても、TreeViewに何も表示されません。 public class KM_Immagine extends Application { @Override public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); Scene scene = new Scene(root); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } } メインクラスでAnchorPaneにTreeViewを追加し、それをSceneに追加する方法でなら、TreeItemが表示出来ます。 私のやり方は、何か初歩的なミスをしていると思うのですが、ネットで色々調べても分かりませんでした。 どなたか、ご教示願います。

  • Java
  • 回答数1
  • ありがとう数0

みんなの回答

  • aoetk
  • ベストアンサー率0% (0/0)
回答No.1

initialize() メソッドの最後で treeView フィールドに対して新たに TreeView のインスタンスを生成して代入していますが、これが間違いです。 @FXML アノテーションを付与したフィールドは、initialize() メソッドに入った時点で、FXML ファイルの内容を元に作られたインスタンスが代入されています。 従って、最後の行で次のように treeView フィールドの setRoot() メソッドを用いて rootItem を設定してあげればいいわけです。 (誤) this.treeView = new TreeView<>(rootItem); (正) this.treeView.setRoot(rootItem);

関連するQ&A

  • シンボルを解決できません

    サンプルプログラムをjavacでコンパイルすると 以下のようなエラーが出ます。 ----------------------------- C:\MyJava>javac menudemo.java menudemo.java:57: シンボルを解決できません。 シンボル: コンストラクタ Menu (java.lang.String) 場所 : Menu の クラス menu1 = new Menu("ファイル"); ^ menudemo.java:70: シンボルを解決できません。 シンボル: メソッド add (java.awt.MenuItem) 場所 : Menu の クラス menu1.add(menuitem1); ^ menudemo.java:71: シンボルを解決できません。 シンボル: メソッド add (java.awt.MenuItem) 場所 : Menu の クラス menu1.add(menuitem2); ^ menudemo.java:72: シンボルを解決できません。 シンボル: メソッド add (java.awt.MenuItem) 場所 : Menu の クラス menu1.add(menuitem3); ^ menudemo.java:75: java.awt.MenuBar の add(java.awt.Menu) は (Menu) に適用できません。 menubar1.add(menu1); ^ エラー 5 個 --------------------------------------------- サンプルプログラムは以下の通りです。 --------------------------------------------- import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class menudemo extends Applet implements ActionListener { Button button1, button2; MenuFrame menuWindow; public void init() { button1 = new Button("ウィンドウの表示"); add(button1); button1.addActionListener(this); button2 = new Button("ウィンドウの非表示"); add(button2); button2.addActionListener(this); menuWindow = new MenuFrame("デモメニュー"); menuWindow.setSize(100, 100); } public void actionPerformed(ActionEvent event) { if (event.getSource() == button1) { menuWindow.setVisible(true); } if (event.getSource() == button2) { menuWindow.setVisible(false); } } } class MenuFrame extends Frame implements ActionListener { MenuBar menubar1; Menu menu1; MenuItem menuitem1, menuitem2, menuitem3; TextField text1; MenuFrame(String title) { super(title); setLayout(new GridLayout(1, 1)); text1 = new TextField(""); add(text1); //メニューバーの生成 menubar1 = new MenuBar(); //メニューの生成 menu1 = new Menu("ファイル"); //メニュー項目の生成 menuitem1 = new MenuItem("Javaの"); menuitem2 = new MenuItem("世界へ"); menuitem3 = new MenuItem("ようこそ"); //イベントリスナーの登録 menuitem1.addActionListener(this); menuitem2.addActionListener(this); menuitem3.addActionListener(this); //メニューへの追加 menu1.add(menuitem1); menu1.add(menuitem2); menu1.add(menuitem3); //メニューバーへの追加 menubar1.add(menu1); //メニューバーを追加 setMenuBar(menubar1); } public void actionPerformed(ActionEvent event) { if (event.getSource() == menuitem1) { text1.setText("Javaの"); } if (event.getSource() == menuitem2) { text1.setText("世界へ"); } if (event.getSource() == menuitem3) { text1.setText("ようこそ"); } } } --------------------------------------------- テキストどおりに入力しているのですが、 いろいろ調べてみても どこがおかしいか自分では分かりませんでした。 どのようにすれば解決するかお教えください。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • TreeViewに重複する値をセット

    VB2005Expressで開発しています。 TreeViewにデータテーブルの値をセットして表示しています。 セットする値に重複する値がある場合、ツリーの構造が崩れてしまいます。左図のようにしたいのですが、右図のようになってしまいます。 あ あ |-い |-い | | | | | -う | -う お | -え |-い お | | | -え ツリーの値に非表示のキーを持たせる等、何か対応法をご存知の方が いらっしゃいましたら教えて下さい。下記がPGMです。 '処理内容:TreeViewにデータテーブルの値をセット Private Function fncTreeViewSet() As Boolean Dim dTbl As DataTable Dim Node As TreeNode Dim intMenuNo As Integer Dim strMenuName1 As String Dim strMenuName2 As String Dim strMenuName3 As String Dim strMenuName4 As String Dim strMenuName5 As String Dim i As Integer Node = TreeView1.SelectedNode dTbl = dsDataSet.Tables("Mメニュー") For i = 0 To dTbl.Rows.Count() - 1 intMenuNo = 0 strMenuName1 = "" strMenuName2 = "" strMenuName3 = "" strMenuName4 = "" strMenuName5 = "" strMenuName1 = Trim$(dTbl.Rows(i)("階層1")) intMenuNo = dTbl.Rows(i)("工程番号") strMenuName2 = Trim$(dTbl.Rows(i)("階層2").ToString) strMenuName3 = Trim$(dTbl.Rows(i)("階層3").ToString) strMenuName4 = Trim$(dTbl.Rows(i)("階層4").ToString) strMenuName5 = Trim$(dTbl.Rows(i)("階層5").ToString) If strMenuName1 = "" Then Else If strMenuName2 = "" Then TreeView1.Nodes.Add(strMenuName1) '階層1をセット Else If strMenuName3 = "" Then fncSerchNode(strMenuName1) TreeView1.SelectedNode.Nodes.Add(strMenuName2) '階層2をセット Else If strMenuName4 = "" Then fncSerchNode(strMenuName2) TreeView1.SelectedNode.Nodes.Add(strMenuName3) '階層3をセット Else If strMenuName5 = "" Then fncSerchNode(strMenuName3) TreeView1.SelectedNode.Nodes.Add(strMenuName4) '階層4をセット Else fncSerchNode(strMenuName4) TreeView1.SelectedNode.Nodes.Add(strMenuName5) End If End If End If End If End If Next TreeView1.SelectedNode = Nothing End Function '処理内容:指定ノード選択 Private Function fncSerchNode(ByVal strMenuName As String) As Boolean Dim Node As TreeNode For Each Node In fncGetAllNodes(TreeView1.Nodes) If Node.Text = strMenuName Then TreeView1.SelectedNode = Node Exit For End If Next End Function '処理内容:子ノードも含んだすべてのノードを取得 Private Function fncGetAllNodes(ByVal Nodes As TreeNodeCollection) As ArrayList Dim Ar As New ArrayList Dim Node As TreeNode For Each Node In Nodes Ar.Add(Node) If Node.GetNodeCount(False) > 0 Then Ar.AddRange(fncGetAllNodes(Node.Nodes)) End If Next Return Ar End Function

  • Javaでエラーになります。

    import javafx.application.*; import javafx.stage.*; import javafx.scene.*; import javafx.scene.control.*; import javafx.scene.layout.*; public class Sample2 extends Application { private Label lb; public static void main(String[] args) } launch(args); } public void start(Stage stage)throws Exception {   //コントロールの作成 lb = new Label(); //コントロールの設定 lb.setText("いらっしゃいませ。"); //ペインの作成 BorderPane bp = new BorderPane( ); //ペインへの追加 bp.setCenter(lb); //シーンの作成 Scene sc = new Scene(bp, 300 ,200); //ステージへの追加 stage.setScene(sc); //ステージの表示 stage.setTitle("サンプル"); stage.show(); } } 上記のコードで下記のエラーが出ます。 何処がおかしいのでしょうか? Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.NoClassDefFoundError: Stage at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.privateGetMethodRecursive(Class.java:3048) at java.lang.Class.getMethod0(Class.java:3018) at java.lang.Class.getMethod(Class.java:1784) at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526) Caused by: java.lang.ClassNotFoundException: Stage at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 7 more こんな感じです。 何処がおかしいのでしょうか? ご多忙中すいません。 ご回答のほど、宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • Java MenuShortCut に関して

    こんにちわ。 Javaのメニューに関して伺いたいことがあります。  以下のコードを作成して、メニューアイテムの  ショートカットは作成できました。  Menu m1=new Menu("file");  MenuShortcut ms = new MenuShortcut             (KeyEvent.VK_N, false);  m1.add(new MenuItem("new",ms));  が、メニュー自体のショートカット作成に  悩んでいます。  Alt+Fでfileメニューを開くようにしたいんです。 どなたかご存知の方がいれば、アドバイスを よろしくお願いします。

    • ベストアンサー
    • Java
  • javaのpaintについて

    public class Main extends JFrame{ public static void main(String args[]){ Main frame = new Main("test"); frame.setVisible(true); } Main(String title){ setTitle(title); setBounds(100, 100, 300, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JMenuBar menubar = new JMenuBar(); JMenu menu1 = new JMenu("File"); menubar.add(menu1); JMenuItem menuitem1 = new JMenuItem("New"); menu1.add(menuitem1); setJMenuBar(menubar); } public void paint(Graphics g){ } } いまウィンドウにメニューバーを表示させようとして上のプログラムで実行させたんですが、画像のようにメニューバーが表示されません。 そこでpaintの引数を消してみたところ表示されます。 しかし、paint内で画像の表示の処理もしたいので引数がないといけません。 どうしたらいいでしょうか?

    • ベストアンサー
    • Java
  • コンテキストメニュークリック時のイベントハンドラ

    C#にてフォームアプリを作成しています。 そこでツリービューに表示されたノードを右クリックしたときにコンテキストメニューが表示される ように下記のように記述しました。表示されたノードの上で右クリックすると「Export」、「Import」 というメニューが表示されます。 しかし、イベントハンドラの書き方がよくわかりません。 「Export」又は「Import」がクリックされたというイベントはどう検出すればよいでしょうか。 // ノード右クリック時の動作 private void treeView1_MouseDown(object sender, MouseEventArgs e) { // 右クリックでもノードを選択させる if (e.Button == MouseButtons.Right) { // ノードの選択 treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y); // コンテクストメニューの作成 ContextMenuStrip contextMenu = new ContextMenuStrip(); ToolStripMenuItem openLabel = new ToolStripMenuItem(); openLabel.Text = "Export"; ToolStripMenuItem deleteLabel = new ToolStripMenuItem(); deleteLabel.Text = "Import"; contextMenu.Items.Add(openLabel); contextMenu.Items.Add(deleteLabel); // ツリービューにコンテキストメニューを追加 treeView1.ContextMenuStrip = contextMenu; } }

  • androidアプリが強制終了してしまいます。

    オプションメニューボタンの「MENU_ITEM0」を押すと、他の機能が呼び出されずに強制終了でエラーになってしまいます。 ・呼び出すソースファイルです。 「public class CogoterActivity extends Activity { //メニューアイテムID private static final int MENU_ITEM0=0, MENU_ITEM1=1; //アクティビティ起動時に呼ばれる @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); requestWindowFeature(Window.FEATURE_NO_TITLE); //リスト要素の情報群の生成 List<ListItem> items=new ArrayList<ListItem>(); for (int i=0;i<50;i++) { items.add(new ListItem(res2bmp(this,R.drawable.icon),"項目"+i)); } //リストビューの設定 ListView listView=new ListView(this); listView.setScrollingCacheEnabled(false); listView.setAdapter(new ListAdapter(this,items)); setContentView(listView); new TextView(this); } public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); //メニューアイテム0の追加 MenuItem item0=menu.add(0,MENU_ITEM0,0,"ぶつぶつ"); item0.setIcon(android.R.drawable.ic_menu_edit); //メニューアイテム1の追加 MenuItem item1=menu.add(0,MENU_ITEM1,0,"ぶくぶく"); item1.setIcon(android.R.drawable.ic_menu_more); return true; } //メニューアイテム選択イベントの処理 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_ITEM0: Intent intent = new Intent(this, cogoter.project.MyActivity.class); startActivity(intent); return true; case MENU_ITEM1: showDialog(this,"","ぶくぶくを押した"); return true; } return true; } //ダイアログの表示 private static void showDialog(Context context,String title,String text) { AlertDialog.Builder ad=new AlertDialog.Builder(context); ad.setTitle(title); ad.setMessage(text); ad.setPositiveButton("OK",null); ad.show(); } //リソース→ビットマップ public static Bitmap res2bmp(Context context,int resID) { return BitmapFactory.decodeResource( context.getResources(),resID); } }」 ・呼び出されるソースコード 「public class MyActivity extends Activity implements View.OnClickListener { private final static int WC=LinearLayout.LayoutParams.WRAP_CONTENT; private final static int FP=LinearLayout.LayoutParams.FILL_PARENT; private EditText editText;//エディットテキスト //アクティビティ起動時に呼ばれる @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); requestWindowFeature(Window.FEATURE_NO_TITLE); //戻り値の指定(6) setResult(Activity.RESULT_CANCELED); //インテントからのパラメータ取得(5) String text=""; Bundle extras=getIntent().getExtras(); if (extras!=null) text=extras.getString("text"); //レイアウトの生成 LinearLayout layout=new LinearLayout(this); layout.setBackgroundColor(Color.rgb(255,255,255)); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); //OKボタンの生成 Button button=new Button(this); button.setText("OK"); button.setOnClickListener(this); button.setLayoutParams(new LinearLayout.LayoutParams(WC,WC)); layout.addView(button); //エディットテキストの生成 editText=new EditText(this); editText.setText(text); editText.setLayoutParams(new LinearLayout.LayoutParams(FP,WC)); layout.addView(editText); } //ボタンクリック時に呼ばれる public void onClick(View v) { //戻り値の指定(6) Intent intent =new Intent(); intent.putExtra("text",editText.getText().toString()); setResult(Activity.RESULT_OK,intent); //アクティビティの終了(7) finish(); } }」

  • addとremoveActionListener

    以下のプログラムは作っているプログラムの簡易版で、他のクラスからaddActionListenerを追加しようとしているですが、やり方が分かりません。 どうプログラミングすればいいか教えてください。 あと、removeActionListenerを使いたいのですが、これについて書かれているサイトが少なく、使い方がよくわからないので、こちらも教えて欲しいです。 import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; public class Test1 extends JFrame { public Test1(){ super("test1"); Set set=new Set(this); setBounds(100,100,806,659); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); add(set); JMenuBar menubar = new JMenuBar(); JMenu menu1=new JMenu("メニュー"); menubar.add(menu1); JMenuItem menuitem1=new JMenuItem("終了"); menu1.add(menuitem1); setJMenuBar(menubar); } public static void main(String[] args){ new Test1().setVisible(true); } } class Set extends JPanel{ Set(final JFrame frame){ /*ここにaddを入れたかった frame.menuitem1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.exit(0); } });*/ //removeActionListener 使用方法不明 } }

    • ベストアンサー
    • Java
  • domでのXML作成について

    PHP4.2のdomを使い、下記のようなXMLを作成したいです。 しかし、Itemのノードに対して、NUMBERとNAMEという子ノードを2つつけるやり方が分からず困っています。 PHPは書いて見たのですが、上手くいっていません。 教えていただけると助かります。 宜しくお願いします。 【作成したいXML】 <Response> <Items> <Item> <NUMBER>47</NUMBER> <NAME>沖縄県</NAME> </Item> </Items> </Response> 【PHP】 $dom = domxml_new_doc("1.0"); $Response = $dom->create_element("Response"); $root = $dom->append_child($Response); $Items = $dom->create_element("Items"); $Item = $dom->create_element("Item"); $NUMBER = $dom->create_element("NAME"); $text1 = $dom->create_text_node("47"); $NUMBER->append_child($text1); $NAME = $dom->create_element("NAME"); $text2 = $dom->create_text_node("沖縄"); $NAME->append_child($text2); $Item->append_child($NAME); $Items->append_child($Item); $root->append_child($Items);

    • ベストアンサー
    • PHP
  • マウスカーソルに応じたmcのスクロール(ループ型)

    マウスカーソルに応じて、複数配置してるmcがカーソルに合わせてスクロールして、ステージからはみ出したら、はみ出した側のステージの反対から出てくるっていうscriptを作ったのですが、うまくいきません。ループしてくれないんです。 ---- _root ---------------------- menu.mcというのがあり、そのmcの中にmenu01.mc、menu02.mc、menu03.mc・・・という感じでmcが配置してあります。menu.mc自体に別のスクリプト掛けてるので、こういう形にしてます。 ---- _root>menumc ---------------------- menu01.mcなどそれぞれのmenuのmcが入ってます。 さらに、それぞれのmcの中にscroll.mcというのをおき、そのscroll.mcにscriptが書いてあります。 ---- _root>menu.mc>menu01.mc 内scroll.mcのscript------ _visible = false; center = Stage.width/2; halfWidth = _parent._width/2; this.onEnterFrame = function() {  with(_parent){  //Scroll Speed   if (_root._xmouse<=180 || (_root._xmouse>250) && (_root._xmouse<=429)) {    moveX = (center-_root._xmouse)/15;   }else if(_root._xmouse>180 && _root._xmouse<=250){    moveX = 0;   }   _x = _x+moveX;   //Return Scroll   if(_x > Stage.width+halfWidth){    _x -= _width+Stage.width;   }else if(_parent._x < -halfwidth){    _x += _width+Stage.width;   }  } }; --------------------- で、これだときちんと思ったような動きでスクロールはするんですが、ただループしてくれないんです。しかもスクロールする毎にそれぞれのmcの間隔がずれてる気がします。最悪の場合だと、mcの上に別のmcが重なったりしてます。 なぜ、このような現象になってしまうのでしょうか?

専門家に質問してみよう