2013-10-27 4 views
0

Я создаю JTree и все его компоненты, а затем в другом классе добавляю его в JPanel. После этого я добавляю JPanel в JFrame; и да, я убедился, что все настроено на видимое, панель добавляется в рамку ДО setVisible() и т. д.JTree не отображается, независимо от того, какой макет я использую

Так почему же моя прокрутка с JTree не появляется?

package TreeExample; 

import java.awt.Color; 

    import javax.swing.JComponent; 
    import javax.swing.JScrollPane; 
    import javax.swing.JTree; 
    import javax.swing.tree.DefaultMutableTreeNode; 

public class Tree extends JComponent 
{ 
    JTree tree; 
    JScrollPane scrollPane; 
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("RootNode"); 

    public Tree() 
    { 
     setVisible(true); 
     setSize(100, 300); 
     createChildNodes(root); 
     tree = new JTree(root); 
     tree.setVisible(true); 
     tree.setSize(100, 300); 
     scrollPane = new JScrollPane(tree); 
     scrollPane.add(tree); 
     scrollPane.setVisible(true); 
     scrollPane.setSize(100, 300); 
     scrollPane.setViewportView(this); 
     scrollPane.setBackground(Color.red); 
    } 

    private void createChildNodes(DefaultMutableTreeNode rootNode) 
    { 
     DefaultMutableTreeNode child1 = new DefaultMutableTreeNode("Child 1"); 
     DefaultMutableTreeNode child2 = new DefaultMutableTreeNode("Child 2"); 
     DefaultMutableTreeNode child3 = new DefaultMutableTreeNode("Child 3"); 

     rootNode.add(child1); 
     rootNode.add(child2); 
     rootNode.add(child3); 

     DefaultMutableTreeNode grandchild1 = new DefaultMutableTreeNode(
       "Grandchild 1"); 
     DefaultMutableTreeNode grandchild2 = new DefaultMutableTreeNode(
       "Grandchild 2"); 

     child1.add(grandchild1); 
     child1.add(grandchild2); 
    } 
} 

Вот моя панель ...

package TreeExample; 

import java.awt.BorderLayout; 
import java.awt.TextArea; 

import javax.swing.JPanel; 

public class Panel extends JPanel 
{ 
    Panel() 
    { 
     setLayout(new BorderLayout()); 
     add(new Toolbar(), BorderLayout.NORTH); 
     add(new TextArea(), BorderLayout.CENTER); 
     add(new Tree(), BorderLayout.WEST); 
    } 
} 

А вот мой кадр.

package TreeExample; 

import javax.swing.JFrame; 

public class Frame extends JFrame 
{ 
    Frame() 
    { 
     setTitle("ToolBar Example"); 
     add(new Panel()); 
     pack(); 
     setVisible(true); 
     setSize(500, 500); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    } 

    public static void main(String[] args) 
    { 
     new Frame(); 
    } 
} 
+1

Жирный для ** внимание ** пожалуйста. не смелейте каждое слово своего поста. – VGR

+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+1

'setSize (100, 300);' Java GUI, возможно, придется работать на нескольких платформах, на разных разрешениях экрана и с использованием разных PLAF. Таким образом, они не способствуют точному размещению компонентов. Чтобы организовать компоненты для надежного графического интерфейса, вместо этого используйте менеджеров компоновки или [их комбинаций] (http://stackoverflow.com/a/5630271/418556), а также макеты и границы для [пробела] (http: //stackoverflow.com/q/17874717/418556). Установка размеров может быть (возможно) причиной этой проблемы. –

ответ

3

Ваше дерево классов расширяет JComponent.

Вы создаете JTree и JScrollPane в своем классе, но вы не добавляете scrollpane к компоненту, чтобы ваш компонент Tree был пуст.

Вам необходимо установить диспетчер компоновки для класса Tree, чтобы добавить к нему некоторые компоненты.

Edit:

scrollPane = new JScrollPane(tree); 
//scrollPane.add(tree); 

Приведенный выше код является неправильным. Сначала вы создаете scrollpane с деревом в качестве параметра. Это правильно, так как дерево добавляется в область просмотра scrollpane.

Однако, вы добавляете дерево непосредственно в scrollpane, что неправильно, потому что компонент может иметь только один родитель, чтобы дерево удалялось из scrollpane.

Комментировать строку, как показано на рисунке, а затем вы должны использовать this.add (scrollpane);

+0

Camickr, ваш совет работал, но он работал только тогда, когда я сделал «this.add (tree)», а не «this.add (scrollPane);». –

+0

@MichaelBaucum, см. Править. – camickr

2

Это в значительной степени то, что отмечал camickr, но с кодом как SSCCE и несколькими другими ухищрениями. Я просто поменял JComponent на JPanel.

enter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.tree.DefaultMutableTreeNode; 

public class Frame extends JFrame 
{ 
    Frame() 
    { 
     setTitle("ToolBar Example"); 
     add(new Panel()); 
     //setSize(500, 500); 
     setLocationByPlatform(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); //should be next to last! 
     setVisible(true); //should be last! 
    } 

    public static void main(String[] args) 
    { 
     new Frame(); 
    } 
} 

class Tree extends JPanel 
{ 
    JTree tree; 
    JScrollPane scrollPane; 
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("RootNode"); 

    public Tree() 
    { 
     //setVisible(true); 
     //setSize(100, 300); 
     createChildNodes(root); 
     tree = new JTree(root); 
     tree.setVisibleRowCount(5); 
     //tree.setVisible(true); 
     //tree.setSize(100, 300); 
     scrollPane = new JScrollPane(tree); 
     //scrollPane.add(tree); 
     //scrollPane.setVisible(true); 
     //scrollPane.setSize(100, 300); 
     //scrollPane.setViewportView(this); 
     scrollPane.setBackground(Color.red); 
     add(scrollPane); 
    } 

    private void createChildNodes(DefaultMutableTreeNode rootNode) 
    { 
     DefaultMutableTreeNode child1 = new DefaultMutableTreeNode("Child 1"); 
     DefaultMutableTreeNode child2 = new DefaultMutableTreeNode("Child 2"); 
     DefaultMutableTreeNode child3 = new DefaultMutableTreeNode("Child 3"); 

     rootNode.add(child1); 
     rootNode.add(child2); 
     rootNode.add(child3); 

     DefaultMutableTreeNode grandchild1 = new DefaultMutableTreeNode(
       "Grandchild 1"); 
     DefaultMutableTreeNode grandchild2 = new DefaultMutableTreeNode(
       "Grandchild 2"); 

     child1.add(grandchild1); 
     child1.add(grandchild2); 
    } 
} 


class Panel extends JPanel 
{ 
    Panel() 
    { 
     setLayout(new BorderLayout()); 
//  add(new Toolbar(), BorderLayout.NORTH); 
     // Don't mix Swing & AWT without good cause.. 
     add(new JTextArea(5,20), BorderLayout.CENTER); 
     add(new Tree(), BorderLayout.WEST); 
    } 
} 
1

Взгляните еще раз на ваш конструктор по умолчанию для дерева:

JTree tree; 
JScrollPane scrollPane; 
DefaultMutableTreeNode root = new DefaultMutableTreeNode("RootNode"); 

public Tree() 
{ 
    setVisible(true); 
    setSize(100, 300); 
    createChildNodes(root); 
    tree = new JTree(root); 
    tree.setVisible(true); 
    tree.setSize(100, 300); 
    scrollPane = new JScrollPane(tree); 
    scrollPane.add(tree); 
    scrollPane.setVisible(true); 
    scrollPane.setSize(100, 300); 
    scrollPane.setViewportView(this); 
    scrollPane.setBackground(Color.red); 
} 

Ваш компонент "Дерево" содержит как JScrollPane и JTree. В вашем конструкторе вы пытаетесь создать экземпляр обоих объектов, а затем добавьте JTree в свой JScrollPane.

В вашем текущем коде вы делаете это плохо. Вы делаете вызов JScrollPane(Component), который, согласно документации:

создает JScrollPane, который отображает содержимое указанного компонента, где как горизонтальные, так и вертикальные полосы прокрутки появляются всякий раз, когда содержание компонента больше, чем вид.

Затем вы пытаетесь добавить дерево снова к JScrollPane , когда он уже был установлен как вид и затем сбросить вид снова к обычаю «Дерево» компонент, который не имеет какую-либо картины логики реализованы.

Попробуйте удалить вызовы JSrollPane.add(Component) и JScrollPane.setViewportView(Component) и при добавлении этого компонента в свой «Группа», добавьте содержащиеся JScrollPane вместо, например, так:

add(new Tree().scrollPane, BorderLayout.WEST); 
Смежные вопросы