powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / обновление панели
9 сообщений из 9, страница 1 из 1
обновление панели
    #33562654
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем привет,
коллеги, запарился я, где-то что-то "недогоняю". Научите плз.
Задача бональная. Нужно проверять содержимое папки и представлять его в виде дерева на панели. При этом "отражение" должно быть актуальным. Проблема в том, что я не пойму - как добится обновления панели:
вроде все перепробовал и repaint() и update() и pack() для окна - ничего не помогает. Научите плз.

код простой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
 import  javax.swing.*;
 import  javax.swing.JScrollPane;
 import  java.awt.BorderLayout;
 import  javax.swing.JTree;
 import  java.io.*;
 import  javax.swing.JPanel;
 import  java.util.*;

 public   class  Ordner  extends  JPanel {
	 private  File dir =  null ;

	 private  JScrollPane jScrollPane =  null ;

	 private  JPanel jPanel =  null ;

	 private  JTree jTree =  null ;

	 private  Thread thread =  null ;

	 private  JFrame frame =  null ;

	/**
	 * This is the default constructor
	 */
	 public  Ordner(JFrame frame) {
		 super ();
		 this .frame = frame;
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	 private   void  initialize() {
		 this .setLayout( new  BorderLayout());
		 this .setSize( 300 ,  200 );
		dir =  new  File(
				"/usr/incomming");
		 this .add(getJScrollPane(), java.awt.BorderLayout.CENTER);

	}

	 void  update() {
		thread = Thread.currentThread();
		 try  {
			 while  (true) {
				thread.sleep( 3000 );
				 this .jTree= null ;
				 this .updateUI();
				 this .repaint();
				 this .frame.pack();
				
				Iterator i = Arrays.asList(dir.list()).iterator();
				 while  (i.hasNext())
					System.out.print(i.next() + "\t");
				System.out.println();

			}
		}  catch  (Exception e) {
			System.err.println(e);
		}
	}

	/**
	 * This method initializes jScrollPane
	 * 
	 * @return javax.swing.JScrollPane
	 */
	 private  JScrollPane getJScrollPane() {
		 if  (jScrollPane ==  null ) {
			jScrollPane =  new  JScrollPane();
			jScrollPane.setViewportView(getJPanel());
		}
		 return  jScrollPane;
	}

	/**
	 * This method initializes jPanel
	 * 
	 * @return javax.swing.JPanel
	 */
	 private  JPanel getJPanel() {
		 if  (jPanel ==  null ) {
			jPanel =  new  JPanel();
			jPanel.setLayout( new  BorderLayout());
			jPanel.add(getJTree(), java.awt.BorderLayout.NORTH);
		}
		 return  jPanel;
	}

	/**
	 * This method initializes jTree
	 * 
	 * @return javax.swing.JTree
	 */
	 private  JTree getJTree() {
		 if  (jTree ==  null ) {
			jTree =  new  JTree(dir.list());
		}
		 return  jTree;
	}

	 public   static   void  main(String[] args) {
		JFrame frame =  new  JFrame();
		Ordner ordner =  new  Ordner(frame);
		frame.getContentPane().add(ordner);
		frame.setSize( 100 ,  100 );
		frame.setLocation( 200 ,  200 );
		frame.setVisible(true);
		frame.setDefaultCloseOperation( 3 );
		frame.pack();

		ordner.update();

	}

}

после запуска программы, я изменяю содержимое папки (/usr/incoming)
и обнаруживаю, что в окне ничего не происходит.

спасибо
...
Рейтинг: 0 / 0
обновление панели
    #33564713
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я немного изменил код, для лучшего восприятия.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
 import  javax.swing.*;
 import  java.io.*;
 import  java.util.*;

 public   class  Ordner  extends  JPanel {
  private  File dir =  null ;
  private  JTree jTree =  null ;
  private  Thread thread =  null ;
  private  JFrame frame =  null ;

 /**
 * This is the default constructor
 */
  public  Ordner(JFrame frame) {
           this .frame = frame;
         frame.setSize( 300 ,  200 );
         frame.setVisible(true);
         frame.setDefaultCloseOperation( 3 );
        frame.getContentPane().add( this );
           frame.pack();
 
 //здесь можно выбрать любую папку и потом менять ее содержимое
          dir =  new  File( "/usr/incomming");
         jTree= new  JTree(dir.list());
              this .add(jTree);
 
           thread = Thread.currentThread();
          try  {
              while  (true) {
                             thread.sleep( 2000 );
                              this .remove(jTree);
                            jTree =  new  JTree(dir.list());
                             this .add(jTree);
 
                           //ничего из этого не работает:
                         //this.updateUI();
                        //this.repaint();
                        //this.validate();
                           //frame.repaint();
                         frame.pack();
 
 //этот блок кода только для контроля
                        Iterator i = Arrays.asList(dir.list()).iterator();
                                  while  (i.hasNext())
                                            System.out.print(i.next() + "\t");
                               System.out.println();

              }
            }  catch  (Exception e) {  System.err.println(e);}
 }

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

}//end of klass

Проблема решилась небольшим изменением кода:
Код: plaintext
1.
2.
3.
 this .remove(jTree);
jTree =  new  JTree(dir.list());
 this .add(jTree);
т.е, я принудительно удалил компонент jTree, создал его заново (специально!, чтобы отразить новое состояние директория ) и добавил на панель.
Мне всегда казалось, что панель сама обновляет включенные в нее компоненты рекурсивным вызовом метода repaint(), однако относительно дерева этого не произошло. Вероятно здесь собака зарыта в другом месте.
В принципе - это решение задачи, но я думаю, что существует более элегантный способ.
Я был бы искренне признателен за ваше участие в разрешении этого вопроса.

с уважением
студент
...
Рейтинг: 0 / 0
обновление панели
    #33564725
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kadet
Хм. Относительно Вашего кода - я так и не увидел, где, по-Вашему, должно происходить обновление данных в дереве.

Простой пример: допустим, Вы пишете следующий код:

Код: plaintext
1.
2.
3.
4.
5.
String s = "Some value";
JButton btn =  new  JButton (s);
 this .add (btn, ....)
.....
s = "Some other value";

Как по-Вашему, сколько Вам после этого придется ждать обновления вида кнопки?
...
Рейтинг: 0 / 0
обновление панели
    #33564736
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quote]
Проблема решилась небольшим изменением кода:
this.remove(jTree);
jTree = new JTree(dir.list());
this.add(jTree);


т.е, я принудительно удалил компонент jTree, создал его заново (специально!, чтобы отразить новое состояние директория ) и добавил на панель.
Мне всегда казалось, что панель сама обновляет включенные в нее компоненты рекурсивным вызовом метода repaint(), однако относительно дерева этого не произошло. Вероятно здесь собака зарыта в другом месте.
В принципе - это решение задачи, но я думаю, что существует более элегантный способ.
[/quote]

Метод repaint вызывает перерисовку компонент. При перерисовке компонента отображает данные описываемые её же моделью.

У тебя в качестве модели для компонента JTree выступает лист полученный от dir.
Cколько не перерисовывай, отображаться будет одно и тоже содержимое.

Вместо удаления дерева, достаточно было апдейтить его модель...
...
Рейтинг: 0 / 0
обновление панели
    #33564741
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs При перерисовке компонента отображает данные описываемые <b>его</b> же моделью.


Кашмар, уже забыл как тут цитаты оформляются :)
...
Рейтинг: 0 / 0
обновление панели
    #33564744
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer kadet
Хм. Относительно Вашего кода - я так и не увидел, где, по-Вашему, должно происходить обновление данных в дереве.

Простой пример: допустим, Вы пишете следующий код:

Код: plaintext
1.
2.
3.
4.
5.
String s = "Some value";
JButton btn =  new  JButton (s);
 this .add (btn, ....)
.....
s = "Some other value";

Как по-Вашему, сколько Вам после этого придется ждать обновления вида кнопки?

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

jTree=new JTree(dir.list());

я поэтому и "завис", что не могу понять в чем же дело
...
Рейтинг: 0 / 0
обновление панели
    #33564747
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs NotGonnaGetUs При перерисовке компонента отображает данные описываемые <b>его</b> же моделью.


Кашмар, уже забыл как тут цитаты оформляются :)

Вот за это - спасибо, однако

метод getModel() класса JTree возвращает только TreeModel, который не имеет методов типа update()

или вы имеете ввиду, что разумнее создавать дерево опираясь изначально на модель (читать содержимое каталога и "строить" по нему дерево) ?
...
Рейтинг: 0 / 0
обновление панели
    #33564761
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kadet разумнее создавать дерево опираясь изначально на модель (читать содержимое каталога и "строить" по нему дерево) ?

Посмотри на конструктор JTree(TreeModel) и метод JTree#setModel(TreeModel).

А потом найди класс DefaultTreeModel.

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

Когда следует дёргать syncronizeModel отдельный вопрос.

Читать список файлов с диска при каждом обновлении окна - это накладная операция. Кроме того, окно оставленное в "покое" может долго не обновляться OS, что приведёт к устареванию отображаемой в нём информации.

Остаётся либо вариант с таймером, который будет дёргать syncronizeModel, скажем, каждые 5 секунд. Либо прикрутить рядом с твоим деревом кнопку "synch", которая будет делать ровно тоже самое, но только в момент выбранный пользователем (изврат, конечно :)).
...
Рейтинг: 0 / 0
обновление панели
    #33569088
kadet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое Вам СПАСИБО

с уажением
студент
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / обновление панели
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]