2012-09-09 24 views
2

我正在嘗試渲染JTree葉以使其具有包含可編輯JTextArea的JPanel,以便用戶可以鍵入文本並能夠向下滾動,因爲它們添加文本,使用包含可編輯JTextArea的JPanel渲染JTree葉

並且還使用包裝來限制文本寬度,以便向下延伸以允許更多空間而不是左右滾動。

到目前爲止,我已經實現了以下內容,但是當我運行代碼時,它看起來很奇怪,好像有兩個葉子,默認的一個和渲染。任何類型的幫助,高度讚賞。

我只想知道我想做什麼是可以實現的,如果沒有,我可以在哪裏修改。

我不想更改圖標,只是葉。

import java.awt.Component; 
import java.awt.event.ComponentEvent; 
import java.awt.event.ComponentListener; 
import java.awt.event.ItemEvent; 
import java.util.EventObject; 
import javax.swing.*; 
import javax.swing.tree.DefaultTreeCellRenderer; 
import javax.swing.tree.TreeCellEditor; 
import javax.swing.tree.TreeCellRenderer; 

/** 
* 
* @author Razaractor 
*/ 
class LeafRenderer extends AbstractCellEditor implements 
     TreeCellRenderer, TreeCellEditor { 

    //Text area to be place on JPanel 
    JTextArea text = new JTextArea(); 
    DefaultTreeCellRenderer nonLeafRenderer = new DefaultTreeCellRenderer(); 

    @Override 
    public Object getCellEditorValue() { 
     return text.getText(); 
    } 

    @Override 
    public boolean isCellEditable(final EventObject event) { 
     return true; 
    } 

    @Override 
    public Component getTreeCellRendererComponent(
      final JTree tree, final Object value, 
      final boolean selected, 
      final boolean expanded, 
      final boolean leaf, 
      final int row, 
      final boolean hasFocus) { 
     //Default leaf 
     Component render = nonLeafRenderer.getTreeCellRendererComponent(tree, 
       value, selected, expanded, leaf, row, hasFocus); 
     if (selected && leaf) { 
      final JPanel panel = new JPanel(); 
      BoxLayout layout = new BoxLayout(panel, BoxLayout.X_AXIS); 
      panel.setLayout(layout); 
      text.setColumns(20); 
      text.setLineWrap(true); 
      text.setRows(5); 
      text.setWrapStyleWord(true); 
      text = new JTextArea(String.valueOf(value)); 
      text.addComponentListener(new ComponentListener() { 

       @Override 
       public void componentResized(ComponentEvent e) { 
        panel.setSize(panel.getPreferredSize()); 
       } 

       @Override 
       public void componentShown(ComponentEvent e) { 
       } 

       @Override 
       public void componentMoved(ComponentEvent e) { 
       } 

       @Override 
       public void componentHidden(ComponentEvent e) { 
       } 
      }); 
      JScrollPane scroll = new JScrollPane(text); 
      panel.add(scroll); 
      render = panel; 
      return panel; 
     } 
     return render; 
    } 

    @Override 
    public Component getTreeCellEditorComponent(
      final JTree tree, 
      final Object value, 
      final boolean isSelected, 
      final boolean expanded, 
      final boolean leaf, 
      final int row) { 
     Component editor = nonLeafRenderer.getTreeCellRendererComponent(tree, 
       value, true, expanded, leaf, row, true); 
     final JPanel p = new JPanel(); 
     if (editor instanceof JPanel) { 
      editor = (JPanel) editor; 
     } 
     return editor; 
    } 

    public void itemStateChanged(ItemEvent itemEvent) { 
     if (stopCellEditing()) { 
      fireEditingStopped(); 
     } 
    } 
} 

enter image description here

enter image description here

+1

我們需要一些代碼。你能給我們一個[SSCCE](http://sscce.org/)嗎? – Keppil

+0

很抱歉,我無法將它提前發佈,因爲當我嘗試將其提交給我的問題時遇到一些錯誤。我如何去發佈它?我有一些關於縮進的錯誤,所以我對於如何發佈有點失落。我也是這個論壇的新手。我將在答覆中發佈它,因爲它似乎是現在唯一可能的方式。請不便。 –

+0

你應該可以編輯你的問題並添加代碼。使用'{}'按鈕讓代碼正確顯示。 – Keppil

回答

0

我不知道你真的想要實現,但嘗試了這些變化。

import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.event.ComponentEvent; 
import java.awt.event.ComponentListener; 
import java.awt.event.ItemEvent; 
import java.util.EventObject; 
import javax.swing.*; 
import javax.swing.tree.DefaultTreeCellRenderer; 
import javax.swing.tree.TreeCellEditor; 
import javax.swing.tree.TreeCellRenderer; 

/** 
* 
* @author Razaractor 
*/ 
class LeafRenderer extends AbstractCellEditor implements 
     TreeCellRenderer, TreeCellEditor { 

    //Text area to be place on JPanel 
    JTextArea text = new JTextArea(); 
    DefaultTreeCellRenderer nonLeafRenderer = new DefaultTreeCellRenderer(); 

    @Override 
    public Object getCellEditorValue() { 
     return text.getText(); 
    } 

    @Override 
    public boolean isCellEditable(final EventObject event) { 
     return true; 
    } 

    @Override 
    public Component getTreeCellRendererComponent(
      final JTree tree, final Object value, 
      final boolean selected, 
      final boolean expanded, 
      final boolean leaf, 
      final int row, 
      final boolean hasFocus) { 
     //Default leaf 
     Component render = nonLeafRenderer.getTreeCellRendererComponent(tree, 
       value, selected, expanded, leaf, row, hasFocus); 
     if (selected && leaf) { 
      final JPanel panel = new JPanel(); 
      BoxLayout layout = new BoxLayout(panel, BoxLayout.X_AXIS); 
      panel.setLayout(layout); 
      //Changed code 
      //moved from 
      text = new JTextArea(String.valueOf(value)); 
      text.setColumns(20); 
      text.setLineWrap(true); 
      text.setRows(5); 
      text.setWrapStyleWord(true); 
      //here. You were creating just ordinary JTextArea. 
      text.addComponentListener(new ComponentListener() { 

       @Override 
       public void componentResized(ComponentEvent e) { 
        panel.setSize(panel.getPreferredSize()); 
       } 

       @Override 
       public void componentShown(ComponentEvent e) { 
       } 

       @Override 
       public void componentMoved(ComponentEvent e) { 
       } 

       @Override 
       public void componentHidden(ComponentEvent e) { 
       } 
      }); 
      JScrollPane scroll = new JScrollPane(text); 
      //changed Code 
      //if you want to hide scrollbars uncomment one of these 
      //scroll.getVerticalScrollBar().setPreferredSize(new Dimension(0, 0)); 
      //scroll.getHorizontalScrollBar().setPreferredSize(new Dimension(0, 0)); 
      panel.add(scroll); 
      render = panel; 
      return panel; 
     } 
     return render; 
    } 

    @Override 
    public Component getTreeCellEditorComponent(
      final JTree tree, 
      final Object value, 
      final boolean isSelected, 
      final boolean expanded, 
      final boolean leaf, 
      final int row) { 
     Component editor = nonLeafRenderer.getTreeCellRendererComponent(tree, 
       value, true, expanded, leaf, row, true); 
     final JPanel p = new JPanel(); 
     if (editor instanceof JPanel) { 
      editor = (JPanel) editor; 
     } 
     return editor; 
    } 

    public void itemStateChanged(ItemEvent itemEvent) { 
     if (stopCellEditing()) { 
      fireEditingStopped(); 
     } 
    } 
} 
+0

我的目標是讓一個帶JTextArea的JPanel替換JTree所具有的默認可編輯葉。所以我不確定我正在實現的是實現我想要的內容。對於滾動條更正,現在有了它。我想返回一個包含JTextArea的JPanel,以允許用戶通過結束行來上下滾動限制文本,所以它不會是長水平線。 –

+0

我只是設法擺脫了默認的葉子外觀,我刪除了所選的條件,現在只有葉子。現在我有我想要的葉子喜歡的東西,就像我張貼的第二張圖片,我遇到了不得不在JTextArea中鍵入文本,以便使用包裝器結束行,但仍使用默認的編輯器輸入樣式,即不會結束行。我怎麼去解決這個問題?謝謝 –

+1

嘗試設置JTree可編輯(jtree.setEditable(true))和JTextArea在面板可聚焦(text.setFocusable(true)) – Riso