Добрый день! Помогите разобраться. Есть два класса: 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);
}
}
В Вашей программе создаются два разных объекта 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) упростят чтение кода на порядок.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости