Невозможно использовать JTree без LayoutManager

Я попытался добавить в свою программу возможность просмотра файлов. Я хотел использовать код отсюда: 1 (ответ Гилберта), но для меня было важно иметь JTree в определенном положении и размере. К сожалению, когда я это сделал, JTree не «отвечает», когда я нажимаю на него.

Вот код:

public class Frame extends JFrame implements Runnable {

private DefaultMutableTreeNode root;

private DefaultTreeModel treeModel;

private JTree tree;
public File fileRoot;

public Frame(){
    super("FileBrowser");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);

    setSize(480, 320);
    setLocation(50,50);
    getContentPane().setLayout(null);

    fileRoot = new File("C:/");
    root = new DefaultMutableTreeNode(new FileNode(fileRoot));
    treeModel = new DefaultTreeModel(root);

    tree = new JTree(treeModel);

    tree.setBounds(10, 39, 155, 177);
    getContentPane().add(tree);
    tree.setShowsRootHandles(true);

}


@Override
public void run() {
    CreateChildNodes ccn = new CreateChildNodes(fileRoot, root);
    new Thread(ccn).start();
}

}

Основной класс:

public class main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Frame());
    }
}

Когда я комментирую

getContentPane().setLayout(null);

и пусть JTree заполняет весь кадр, он работает как надо


person Ch0mik18    schedule 14.07.2016    source источник


Ответы (1)


Попробуйте изменить следующие строки:

tree.setBounds(10, 39, 155, 177);
getContentPane().add(tree);

to

JScrollPane scroller = new JScrollPane(tree);
scroller.setBounds(10, 39, 155, 177);
getContentPane().add(scroller);

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

P.S. Попробуйте изучить менеджеры компоновки. Они очень полезны.

person Sergiy Medvynskyy    schedule 14.07.2016
comment
Спасибо, это работает! Я знаю, что в целом гораздо лучше использовать менеджеры компоновки, но в моем случае я хочу отобразить свою программу на определенном экране, а компоновка не является ключевой функцией, поэтому я выбрал более простой способ. - person Ch0mik18; 14.07.2016
comment
Чтобы расширить то, что в этом ответе наиболее стоит обратить внимание: графические интерфейсы Java должны работать с разными ОС, размером экрана, разрешением экрана и т. д., используя разные PLAF в разных регионах. Как таковые, они не способствуют идеальной компоновке пикселей. Вместо этого используйте менеджеры макетов или их комбинации вместе с отступами и границами макета для пробел. - person Andrew Thompson; 14.07.2016
comment
@ Ch0mik18, в этом случае было бы неплохо, если бы вы приняли мой ответ как правильный. - person Sergiy Medvynskyy; 14.07.2016