Как компонент может автоматически обновлять контент?

Я новичок в библиотеке Swing. Я пытаюсь сделать настольное приложение типа эта картинка.

Этот объект JFileChooser предназначен для выбора целевого каталога для отображения дерева на правой панели.

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

Что я могу сделать дальше? Спасибо за вашу помощь Вот мой код:

public class DesktopUI {

    private Path pathDirectChoose ;
    private final File root = new File("/");
    private File des;

    public DesktopUI(){
        initUI();
    }
    public void setPathDirectChoose(Path pathDirectChoose){
        this.pathDirectChoose = pathDirectChoose;
    }
    public void setDes(String des){
        this.des = new File(des);
    }

    private void initUI(){
        JFrame frame = new JFrame("TestProject");
        //make TopMenuBar
        JMenuBar menuBar = new JMenuBar();
        JMenu optionMenu = new JMenu("Option");
        JMenuItem chooseSecretFolder = new JMenuItem("Choose Secret Folder");
        JMenuItem exitItem = new JMenuItem("Exit");
        JMenu helpMenu = new JMenu("Help");
        JMenuItem helpItem = new JMenuItem("?Help");
        JMenuItem aboutItem = new JMenuItem("About");

        // config chooseSecretFolder
        chooseSecretFolder.setToolTipText("Choose destinaion folder to encrypt");
        chooseSecretFolder.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
        exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_MASK));
        helpItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,InputEvent.CTRL_MASK));
        chooseSecretFolder.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                File selectedDirect = null;
                JFileChooser fileChooser = new JFileChooser();
                fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
                int result = fileChooser.showOpenDialog(fileChooser);
                selectedDirect = fileChooser.getSelectedFile();
                setPathDirectChoose(selectedDirect.toPath());
                setDes(String.valueOf(pathDirectChoose));
                System.out.println(String.valueOf(pathDirectChoose));

            }
        });

        //add ActionListener for exit Item
        exitItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        optionMenu.add(chooseSecretFolder);
        optionMenu.add(exitItem);
        helpMenu.add(helpItem);
        helpMenu.add(aboutItem);
        menuBar.add(optionMenu);
        menuBar.add(helpMenu);
        frame.setJMenuBar(menuBar);

        //make JTextField to show PathFile choosed and view Tree
        JTextField pathFileJText = new JTextField();
        JTree leftTree = new JTree(new FileTreeModel(root));
        JTree rightTree = new JTree(new FileTreeModel(des));
        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        JScrollPane leftPane = new JScrollPane(leftTree);
        JScrollPane rightPane = new JScrollPane(rightTree);
        //add TreeSelectionListener for tree system
        leftTree.addTreeSelectionListener(new TreeSelectionListener() {
            @Override
            public void valueChanged(TreeSelectionEvent e) {
                Object object = e.getPath().getLastPathComponent();
                System.out.println(object);
                pathFileJText.setText(object.toString());
                // make a popupMenu when file be choosed
                JPopupMenu popupMenu = new JPopupMenu();
                JMenuItem encryptFile = new JMenuItem("Encrypt File");
                JMenuItem decryptFile = new JMenuItem("Decrypt File");
                popupMenu.add(encryptFile);
                popupMenu.add(decryptFile);

                leftTree.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseReleased(MouseEvent e) {
                        super.mouseReleased(e);
                        if (e.getButton() == MouseEvent.BUTTON3){
                            popupMenu.show(e.getComponent(),e.getX(),e.getY());
                        }
                    }
                });
            }
        });

        //show all componets
        splitPane.setLeftComponent(leftPane);
        splitPane.setRightComponent(rightPane);
        frame.add(pathFileJText,BorderLayout.NORTH);
        frame.add(splitPane,BorderLayout.CENTER);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(500,500);
        frame.setVisible(true);
    }

    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                DesktopUI desktopUI = new DesktopUI();
            }
        });
    }
}  

Вам нужно обновить свое дерево новой моделью, когда вы устанавливаете новый каталог. Что-то вроде rightTree.setModel(new FileTreeModel(des)); в вашем методе setDes. Для этого вам нужно объявить вашу переменную rightTree как свойство объекта.

Sergiy Medvynskyy 08.10.2018 12:59

как я могу объявить мой rightTree var как свойство объекта. а как насчет использования PropertyChangeListener?

thai bui xuan 08.10.2018 13:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я исправил ваш пример, но не уверен, работает ли он, потому что вы не предоставили SSCCE

public class DesktopUI {

    private Path pathDirectChoose ;
    private final File root = new File("/");
    private File des;
    private JTree rightTree; // declare as object property

    public DesktopUI(){
        initUI();
    }
    public void setPathDirectChoose(Path pathDirectChoose){
        this.pathDirectChoose = pathDirectChoose;
    }
    public void setDes(String des){
        this.des = new File(des);
        rightTree.setModel(new FileTreeModel(des));
    }

    private void initUI(){
        JFrame frame = new JFrame("TestProject");
        //make TopMenuBar
        JMenuBar menuBar = new JMenuBar();
        JMenu optionMenu = new JMenu("Option");
        JMenuItem chooseSecretFolder = new JMenuItem("Choose Secret Folder");
        JMenuItem exitItem = new JMenuItem("Exit");
        JMenu helpMenu = new JMenu("Help");
        JMenuItem helpItem = new JMenuItem("?Help");
        JMenuItem aboutItem = new JMenuItem("About");

        // config chooseSecretFolder
        chooseSecretFolder.setToolTipText("Choose destinaion folder to encrypt");
        chooseSecretFolder.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
        exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_MASK));
        helpItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,InputEvent.CTRL_MASK));
        chooseSecretFolder.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                File selectedDirect = null;
                JFileChooser fileChooser = new JFileChooser();
                fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
                int result = fileChooser.showOpenDialog(fileChooser);
                selectedDirect = fileChooser.getSelectedFile();
                setPathDirectChoose(selectedDirect.toPath());
                setDes(String.valueOf(pathDirectChoose));
                System.out.println(String.valueOf(pathDirectChoose));

            }
        });

        //add ActionListener for exit Item
        exitItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });


        optionMenu.add(chooseSecretFolder);
        optionMenu.add(exitItem);
        helpMenu.add(helpItem);
        helpMenu.add(aboutItem);
        menuBar.add(optionMenu);
        menuBar.add(helpMenu);
        frame.setJMenuBar(menuBar);

        //make JTextField to show PathFile choosed and view Tree
        JTextField pathFileJText = new JTextField();
        JTree leftTree = new JTree(new FileTreeModel(root));
        rightTree = new JTree(new FileTreeModel(des)); // no type declaration here
        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        JScrollPane leftPane = new JScrollPane(leftTree);
        JScrollPane rightPane = new JScrollPane(rightTree);
        //add TreeSelectionListener for tree system
        leftTree.addTreeSelectionListener(new TreeSelectionListener() {
            @Override
            public void valueChanged(TreeSelectionEvent e) {
                Object object = e.getPath().getLastPathComponent();
                System.out.println(object);
                pathFileJText.setText(object.toString());
                // make a popupMenu when file be choosed
                JPopupMenu popupMenu = new JPopupMenu();
                JMenuItem encryptFile = new JMenuItem("Encrypt File");
                JMenuItem decryptFile = new JMenuItem("Decrypt File");
                popupMenu.add(encryptFile);
                popupMenu.add(decryptFile);

                leftTree.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseReleased(MouseEvent e) {
                        super.mouseReleased(e);
                        if (e.getButton() == MouseEvent.BUTTON3){
                            popupMenu.show(e.getComponent(),e.getX(),e.getY());

                        }
                    }
                });
            }

        });

        //show all componets
        splitPane.setLeftComponent(leftPane);
        splitPane.setRightComponent(rightPane);
        frame.add(pathFileJText,BorderLayout.NORTH);
        frame.add(splitPane,BorderLayout.CENTER);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(500,500);
        frame.setVisible(true);

    }




    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                DesktopUI desktopUI = new DesktopUI();
            }
        });

    }
}

Это сработало. setModel () в setDes () обновляет FileTreeModell, когда я выбираю новую des var. Большое спасибо. Теперь я могу выполнить следующую работу, чтобы заполнить заявку @Sergiy Meddvynskyy

thai bui xuan 08.10.2018 14:34

@thaibuixuan, в этом случае отметьте мой ответ как полезный (оставьте галочку, чтобы ответить). Вы получите 2 очка репутации.

Sergiy Medvynskyy 08.10.2018 14:40

Привет . Теперь я пытаюсь заменить rightTree на JList, но я не знаю, как создать FileListMode для обновления списка, когда я выбираю новый каталог в JFileChooser. Вы можете мне помочь ! @ Сергей Медвинский

thai bui xuan 21.10.2018 21:53

@thaibuixuan, пожалуйста, задайте новый вопрос и разместите там свой новый код в форме минимальный воспроизводимый пример.

Sergiy Medvynskyy 22.10.2018 07:53

Другие вопросы по теме