• 締切済み

JTreeのTreeCellRendererについて

_ranco_の回答

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

ノードに、表示だけでなくコンポーネントとしての機能が欲しいときは、セルレンダラと共にセルエディタも必要です。JTreeのドキュメンテーションをよく読んでください。

_kit_
質問者

お礼

回答ありがとうございます。 セルレンダラと共にセルエディタというものも必要なのですね。 調べながら実装してみます。うまくいかなかったらまた質問させてください。

_kit_
質問者

補足

セルレンダラ→表示させるためのもの セルエディタ→エディタの機能を持たせるためのもの というのはわかりました。 質問時のコードのクラスにTreeCellEditorを実装して、getTreeCellEditorComponentで操作できるチェックボックスを初期表示できるようになりました。 ノード自体にbooleanの変数を持たせて、チェックボックスの状態を保持し、 レンダリング時やエディタの初期表示時にそこを参照して表示するようにしてみたのですが、どうも動きがおかしいです。 TreeCellEditorのisCellEditableを実装して、マウスイベントを拾い、 ノードのboolean変数を切り替えるようにしたところ、ツリー初期表示後の一回目のクリックだけチェックがうまく切り替わりません(たとえばオフの状態で初期表示だと、クリックすると一瞬チェックが入ってまた外れます)。 それ以降のクリックは目的通りの動きになるのですが・・・・ デバッガで追ってみたところ、JComponentのpaintWithOffScreenBufferという関数が呼ばれた瞬間にチェックの状態が元に戻っていました。 (ちょっと質問がつながっていないかもしれませんが、) エディタで表示させたコンポーネントの状態はどのように取得すればよいのでしょうか。 ※今の実装はコンポーネントの状態を取得しているわけではないので、そのような処理にした方が良いのかなと思いました。 よろしくお願いいたします。

関連するQ&A

  • .NetのTreeViewの使い方について

    TreeView配下にTreeNodeを作成・表示した際に、ノードをクリックすると自動的にリバース表示されますが、これを止めることはできないでしょうか。 TreeView1   -Node0      -Node01      -Node02      -Node03   -Node1      -Node11      -Node12 のようになっているとき、たとえばNode01がクリックされたらNode0,Node01,Node02,Node02のすべてのForeColorをColor.Redにするなどして、まとまりのあるものとして認識させたいのですが、リバース表示が邪魔です。TreeViewやNodeのプロパティ、メソッドも調べてみましたが、それらしいものがありません。 OS:Windows7 (Home) 言語:VisualStudio 2010(VidsualBasic) よろしくお願いいたします。

  • C#のツリービューでツリーノードとデータの関連付け

    こんにちは。 C#でツリービューの操作をしています。 すでに階層構造を持つデータがあります。これをツリービューに表示させようとしています。 TreeNode treeNodeFruits = new TreeNode("果物"); としてツリービューに追加してあげると普通に表示できますが、このままだと独自データと関連付けがされていないため、ノードをクリックした際に何もできません。 C++ではHTREEITEMのlParamにユーザーデータのポインタをセットできますが、C#ではツリーノードに関連付けできそうな項目が見当たりません。 C#ではツリーノードと独自に持つデータとの関連付けをどのようにすればよろしいのでしょうか?

  • JTextAreaの大きさの指定と固定について

    今JTextAreaをJPanelに貼り付けてそれを更にJFrameに貼り付けるプログラムを書いています。 フレームはBorderLayoutにしており、WESTにもEASTにもパネルをaddしてます。 frame.add(createWestPanel(), BorderLayout.WEST); JPanel createWestPanel() {   ・・・   return p; } の様な形です。 このパネルにJTextAreaを使用しており、 ボタンを押すとJTextAreaに文を表示する仕様にしたいのですが 大きさを指定しなければ表示する字数によって大きさが勝手に変更されてしまい(その様になるのは当たり前ですが)、他のコンポーネント(例えばBorderLayout.CENTERにあるボタンなど)と重なったりしてしまいます。 そこで、JTextAreaの大きさを指定した上で固定したいのですがどのようにすればよいでしょうか? また、 WestPanelを □□□    ボタン (JTextField) (JButton)  JTextArea と言った形にしたいのですが、どうやってもJTextAreaがJButtonの右に来てしまいます。 これも解決方法を教えていただけると助かります。 お願いします。

  • java swing での質問です。

    javaのプログラミングをeclipseでしているのですが swingで行き詰ってしまいました。 タブペインを使いタブパネルを作り、その中にボタンを配置したのですが、 ボタンの位置をsetBoundsで動かすことができませんでした。 他の命令を使わなければならないのでしょうか? プログラミング自体が初心者のため、説明に不備があると思いますが 助けていただけると幸いです。 ひどいプログラミングかと思いますが張らせていただきました package gui; import java.awt.*; import javax.swing.*; public class ReisyokuMenu extends JFrame{ /*serialVersionUID*/ private static final long serialVersionUID=1L; /*コンポーネント作成*/ JButton syokuzaiBtn = new JButton("食材一覧"); JButton syoumiBtn = new JButton("賞味期限順"); JButton bunruiBtn = new JButton("分類"); JButton returnBtn=new JButton("Topへ"); JPanel tabPanel1 = new JPanel(); JPanel tabPanel2 = new JPanel(); JTabbedPane tabbedpane = new JTabbedPane(); public ReisyokuMenu(){ /*Closeボタンでアプリケーションが終了しないように設定*/ setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); /*フレームサイズを変更できないように設定*/ setResizable(false); /*フレームコンテナのインスタンスを生成*/ Container cPane = getContentPane(); /*レイアウトマネジャを利用しない(座標を指定する)*/ cPane.setLayout(null); setLocationRelativeTo(null); setSize(400, 380);//setBoundsはy、x、幅、高さを指定するのでsetLocationRelativeToで位置指定をする為に使用。 setTitle("一人暮らし支援ツール");//アプリケーションタイトルを入れる tabbedpane.addTab("食材を見る", tabPanel1); tabbedpane.addTab("食材を探す", tabPanel2); tabPanel1.add(syokuzaiBtn); tabPanel1.add(syoumiBtn); tabPanel1.add(bunruiBtn); syokuzaiBtn.setLocation(50, 80);//「選択」ボタン syoumiBtn.setBounds(10,10,325,120); bunruiBtn.setBounds(10,270,90,40); tabPanel2.add(new JLabel("食材名:")); tabPanel2.add(new JTextField("", 10)); setContentPane(tabbedpane); } public void setVisible(boolean isVisible){ if(isVisible){ /*フレームの表示位置を指定(x,y)*/ setLocation(200,200); } /*フレームを表示*/ super.setVisible(isVisible); } }

  • XMLをJSPで再帰処理を使って処理する方法について

    たびたびすみません、XMLの処理をする上でやり方がわからなくなって しまったので、教えていただきたいのですが。。。 XMLのルートノード以下のものを取得する場合、階層がはっきりしてないとき などは、再帰処理をつかってノードを取得するようにしたいと思っているんですが、JSPでの再帰処理がなかなかうまくできないんです。 再帰処理を行うクラスのメソッドが例えば、 public boolean scanEach(NodeList agNode) { try{ for(int nCnt=0;nCnt<agNode.getLength();nCnt++) { node = agNode.item(nCnt) ; if(node.getNodeType() == Node.ELEMENT_NODE){ out.println("『 "+ node.getNodeName() +"』<br>") ; } if(node.hasChildNodes()) blScanEach(node.getChildNodes()) ; } } catch(Exception except) { except.printStackTrace() ; return false ; } return true ; } と要素ノードを取り出すメソッドがあったら、out.printlnの部分が JSP内での宣言じゃないのでエラーになってしまいます。 JSPで取り出して表示できるようにしたいのですが、なにかいい方法が ないか、教えていただけないでしょうか。 再帰処理を使わなくても、例えばどの階層にあるかわからない<タグ>タグを 検索したりする方法が他にあったら、その方法もおしえていただけると ありがたいのですが。。 何度も申し訳ありません。よろしくお願いします。

    • ベストアンサー
    • XML
  • ボタンがマウスオーバーしないと表示されない

    java初心者です。 やりたいことは、 i_step変数によって、表示する、画像や、パネル(ボタンが作成されています)を替えたいのです。 今はB_Nextボタンによってi_step変数が加算されます。 i_step=1になると、画像が表示されるのですが、 一緒に表示されてほしい【ボタン1】が表示されません。 ですが、マウスアップすると、表示されるようになります。 はじめは【NEXT】ボタンも表示されなかったのですが、 過去の質問を検索し、 http://oshiete1.goo.ne.jp/qa2530138.html を参照して、super.paint(g);を追加したら、 【NEXT】ボタンは表示されるようになりました。 ソースは以下です。 package guidance_ap; import java.awt.*; import javax.swing.*; public class Test extends JApplet { Image img1, img2; private JButton B_Next = null; private JPanel jContentPane = null; private JPanel jPanel1 = null; private JButton b1 = null; int i_step = 0; public Test() { super(); } public void init() { this.setSize(640, 480); this.setContentPane(getJContentPane()); img1 = getImage(getCodeBase(), "test.gif"); img2 = getImage(getCodeBase(), "test2.gif"); } public void paint(Graphics g) { super.paint(g); jContentPane.removeAll(); jContentPane.add(getB_Next(), null); switch (i_step) { case 0: g.drawImage(img1, 0, 0, this); break; case 1: g.drawImage(img2, 0, 0, this); jContentPane.add(getJPanel1(), null); break; } } private JPanel getJContentPane() { if (jContentPane == null) { try { jContentPane = new JPanel(); jContentPane.setLayout(null); jContentPane.setOpaque(false); } catch (java.lang.Throwable e) { e.printStackTrace(); } } return jContentPane; } private JButton getB_Next() { if (B_Next == null) { try { B_Next = new JButton(); B_Next.setText("NEXT"); B_Next.setLocation(new Point(559, 0)); B_Next.setSize(new Dimension(80, 40)); B_Next.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { i_step++; repaint(); } }); } catch (java.lang.Throwable e) { e.printStackTrace(); } } return B_Next; } private JPanel getJPanel1() { if (jPanel1 == null) { try { jPanel1 = new JPanel(); jPanel1.setOpaque(false); jPanel1.setLayout(null); jPanel1.setSize(new Dimension(640, 480)); jPanel1.setLocation(new Point(0, 0)); jPanel1.setPreferredSize(null); jPanel1.add(getb1(), null); } catch (java.lang.Throwable e) { e.printStackTrace(); } } return jPanel1; } private JButton getb1() { if (b1 == null) { try { b1 = new JButton(); b1.setSize(new Dimension(190, 40)); b1.setText("ボタン1"); b1.setLocation(new Point(90, 400)); b1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed( java.awt.event.ActionEvent e) { } }); } catch (java.lang.Throwable e) { e.printStackTrace(); } } return b1; } } ちなみに【ボタン1】は画像と重なる位置にあります。 super.paint(g);を paintの最後に記述すると、ボタンは表示されますが、 画像が一瞬でて消えてしまいます。 何がいけないのでしょうか?

    • ベストアンサー
    • 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での背景画像表示

    現在javaでゲームのメニュー画面を作っているのですが、ボタンを配置する所まではできたんですが、背景に画像を表示することができなくて困っています! import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.border.LineBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import java.awt.Container; public class Mati extends JFrame{ public static void main(String[] args){ Mati frame = new Mati(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10,650,650); frame.setTitle("街"); frame.setVisible(true); JPanel h = new JPanel(); h.setOpaque(false); ImageIcon icon1 = new ImageIcon("Mati.jpg"); JLabel label1 = new JLabel(icon1); JLabel label2 = new JLabel(); h.add(label1); } Mati(){ JButton button1 = new JButton("宿屋"); button1.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button2 = new JButton("道具屋"); button2.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button3 = new JButton("武器屋"); button3.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button4 = new JButton("街を出る"); button4.setFont(new Font("Mairyo", Font.PLAIN, 30)); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); p.add(Box.createRigidArea(new Dimension(10,30))); p.add(button1); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button2); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button3); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button4); getContentPane().add(p, BorderLayout.CENTER); } } ソースはこのようになっています。これからどうすれば背景画像が表示されるか教えていただきたいです。 よろしくお願いします。

  • イベント処理

    javaでプログラムを作り始めて間がないのですが、イベント処理に関して行き詰ってしまいました。望む動作は、メニュー→ゲーム→じゃんけんと選択すると、初期の状態として「じゃんけん・・・・」という文字とボタンが表示され、どれかボタンを押すと対応して「~ボタンが押されました」と表示させたいのですが、作ったプログラムだと、ボタンを押しても反応しません。後々メニューにもいくつかアイテムを追加したり、最終的にはコンピュータとじゃんけんをするプログラムを書きたいと思っています。ifを使った方法しか思いつかないのですが、どこがおかしいのでしょうか? import javax.swing.*; import java.awt.event.*; import java.awt.BorderLayout; public class question extends JFrame implements ActionListener{       JLabel label1;       JPanel p2;       public static void main(String[] args){            question test = new question("質問");            test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);            test.setVisible(true);       }       question(String title){            setTitle(title);            setBounds( 10, 10, 300, 250);            JMenuBar menuBar = new JMenuBar();            JMenu menu = new JMenu("メニュー");            JMenu submenu = new JMenu("ゲーム");            JMenuItem subitem1 = new JMenuItem("じゃんけん");            subitem1.addActionListener(this);            subitem1.setActionCommand("Start");            submenu.add(subitem1);            menu.add(submenu);            menuBar.add(menu);            setJMenuBar(menuBar);            JPanel p1 = new JPanel();            p2 = new JPanel();            label1 = new JLabel("");            JButton btn1 = new JButton("グー");            btn1.addActionListener(this);            btn1.setActionCommand("goo");            JButton btn2 = new JButton("チョキ");            btn2.addActionListener(this);            btn2.setActionCommand("cyoki");            JButton btn3 = new JButton("パー");            btn3.addActionListener(this);            btn3.setActionCommand("paa");            p1.add(label1);            p2.add(btn1);            p2.add(btn2);            p2.add(btn3);            getContentPane().add(p1, BorderLayout.PAGE_START);            getContentPane().add(p2, BorderLayout.PAGE_END);            p2.setVisible(false);      }      public void actionPerformed(ActionEvent e){            String cmd = e.getActionCommand();            if (cmd.equals("Start")){                 p2.setVisible(true);                 label1.setText("じゃんけん・・・・");                 if (cmd.equals("goo")){                      label1.setText("グーが押されました");                 }else if (cmd.equals("cyoki")){                      label1.setText("チョキが押されました");                 }else if (cmd.equals("paa")){                      label1.setText("パーが押されました");                 }            }       } }

    • ベストアンサー
    • Java
  • DelphiのTreeViewでの+ボタンの出し方

    WindowsXP、Delphi2009で開発しています。 TTreeViewのAdvancedCustomDrawItemで下記の様に動的にノードの描画を行っていますが、ノードを展開・折りたたみする際に使う+ボタンが表示できなくて困っています。 +ボタンを表示させる方法が分かる方、ご教示願います。 ------------------------------------------------------------ procedure TForm3.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean); var Rect :TRect; begin defaultdraw := false; Rect := Node.DisplayRect(True); if Node.Selected = true then begin Sender.Canvas.Font.Color := clWhite; end else begin if Copy(Node.Text,pos('\',Node.Text) + 1, length(Node.Text)) = 'False' then begin Sender.Canvas.Font.Color := clWindowText; end else begin Sender.Canvas.Font.Color := clRed; end; end; Sender.Canvas.TextOut(Rect.Left,Rect.Top,Copy(Node.Text,1,pos(',',Node.Text) - 1)); end; ------------------------------------------------------------