Добавление записей в JList из метода другого класса

204
19 мая 2017, 14:14

Добрый день! Помогите разобраться. Есть два класса: Tree и List. Необходимо, чтобы когда делаешь click по "листу" JTree этот самый "лист" в виде String уходил как новая запись в JList. Всё вроде как верно, ошибок нет, но ничего и не происходит.

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.border.TitledBorder;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
public class RunProg extends JFrame {
    public static void main(String[] args) {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridLayout(0,1));
        frame.add(new tree());
        frame.add(new list());
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
    }
}
class tree extends JPanel {
    final   String     ROOT  = "Корневая запись";
    final   String[]   nodes = new String[]  {"Напитки", "Сладости"};
    final   String[][] leafs = new String[][]{{"Чай", "Кофе", "Коктейль", 
                                               "Сок", "Морс", "Минералка"},
                               {"Пирожное", "Мороженое", "Зефир", "Халва"}};
    private list list;
    tree(){
        list = new list();
        DefaultMutableTreeNode root = new DefaultMutableTreeNode(ROOT);
        DefaultMutableTreeNode drink = new DefaultMutableTreeNode(nodes[0]);
        DefaultMutableTreeNode sweet = new DefaultMutableTreeNode(nodes[1]);
        root.add(drink);
        root.add(sweet);
        for ( int i = 0; i < leafs[0].length; i++)
            drink.add(new DefaultMutableTreeNode(leafs[0][i], false));
        for ( int i = 0; i < leafs[1].length; i++)
            sweet.add(new DefaultMutableTreeNode(leafs[1][i], false));
        DefaultTreeModel treeModel1 = new DefaultTreeModel(root, true);
        JTree tree1 = new JTree(treeModel1);
        tree1.addMouseListener(new MouseAdapter() {
             public void mouseClicked(MouseEvent me) {
                  DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree1.getLastSelectedPathComponent();
                  if (node == null) return;
                  String s = node.toString();
                    list.addlist(s);
             }      
        });   
        add(new JScrollPane(tree1));
        setSize(400, 300);
        setVisible(true);         
    }       
}
@SuppressWarnings("serial")
class list extends JPanel {
    DefaultListModel<String> dlm = new DefaultListModel<String>();
    public JList<String> list;
    @SuppressWarnings({ "unchecked", "rawtypes" })
    list(){
        list = new JList(dlm);
        dlm.addElement("Чай");
        list.setPreferredSize(new Dimension(100,200));
        list.setBorder(new TitledBorder("Список")); 
        add(new JScrollPane(list));
        setVisible(true);
    }
    public void addlist(String str) {
        dlm.addElement(str);
    }
}
Answer 1

В Вашей программе создаются два разных объекта list.

Один отображается в окне:

frame.add(new list());

Второй создается в дереве:

tree(){
    list = new list();

Во второй список Вы добавляете элементы. Первый не изменяется совсем.

Чтобы исправить это Вам нужно либо передать дереву ссылку на список, либо создавать список в дереве и затем добавлять его в окно.

Например (первый способ):

//в методе main
list list = new list();
frame.add(new tree(list));
frame.add(list);
//в конструкторе tree
tree(list listToAdd){
    list = listToAdd;

P.S. В коде значительно легче искать ошибки если соблюдаются правила именования. Осмысленные названия классов и объектов (FoodsMenuTree, OrdersList, selectedProducts) упростят чтение кода на порядок.

READ ALSO
Поиск строк в большом массиве по префиксу

Поиск строк в большом массиве по префиксу

Имеется большой отсортированный массив строк (100000 строк, каждая строка может иметь длину в 32 символа (латинские буквы и цифры))Вводим начало...

245
каков механизм работы xa транзакции?

каков механизм работы xa транзакции?

Рассмотрим сценарий когда пользователь хочет обновить данные на двух базах , которые расположены на других узлах сетиДля этого он использует...

265
Log4j не видит properties файл

Log4j не видит properties файл

У меня задача организовать вывод в консоль объектов при добавлении в базу:

502
Метод Main не завершается (java)

Метод Main не завершается (java)

При старте miltithreading программы из IDE (IDEA) программа корректно работает, завершается, все потоки отрабатывают, все ресурсы закрытыНо после сборки...

247