Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Порядок инициализации в классе / 9 сообщений из 9, страница 1 из 1
18.11.2005, 12:51
    #33386624
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок инициализации в классе
Собственно, задача: делается класс "список, фильтруемый по вводимому значению". То есть пользователь жмет в textfield-е на кнопки, и содержимое jlist-а бодро сжимается, оставляя только строки, соответствующие маске. Для этого делается наследник JList, который внутри себя создает панельку и скролл для саморазмещения, textfield фильтра, размещенный на той же панельке итп. Итого - получается объект, которым в любом месте можно заменить JList исправлением одной-двух строк.

Для осуществления собственно фильтрации создается внутренняя ListModel, фильтрующая первичную модель листбокса. Соответственно, до пятой версии работал примерно следующий код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 class  FilteredList {

   public  FilteredList (ListModel model) {
     super  (makeFilterModel (model));
    ....
  }

   private  ListModel extModel;
   private  ListModel intModel;

   private  ListModel makeFilterModel (ListModel model) {
    extModel = model;
    intModel =  new  FilterModel (model);
     return  intModel;
  }

   public  ListModel getModel() { return  extModel;}

  TextListener lsnrFilterChanged =  new  TextListener() {
    ... intModel.filterBy (textFilter.getText()); ...
  }
}

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

Вопрос: существует ли какое-либо красивое решение в такой ситуации? Я пока что остановился на варианте

Код: plaintext
1.
2.
3.
4.
   public  FilteredList (ListModel model) {
     super  ( new  Object[ 0 ]);
    setModel (model);
  }

но хочется чего-то менее уродского.
...
Рейтинг: 0 / 0
18.11.2005, 13:26
    #33386741
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок инициализации в классе
может setModel() переопределить?
...
Рейтинг: 0 / 0
18.11.2005, 13:50
    #33386821
grady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок инициализации в классе
авторВ пятой версии этот код, соответственно, перестает работать, ругаясь на невозможность слишком раннего обращения к this.


Проверил в 1.4 - компилятор тоже по рукам за подобные шутки выдает. И правильно делает.

Можно сделать фабричный метод.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 public   class  MyClass {

	 private  MyClass(){...}
	
	 static  MyClass construct(Object[] args){
	     MyClass ret;
		
	     ret =  new  MyClass();
	     ret.initialize(args);
		
	      return  ret;
	}
	
	 public   static   void  main(String[] args) {
	     MyClass my = MyClass.construct(...);
	}

}

Хотя по-большому счету те же яйца, вид сбоку
...
Рейтинг: 0 / 0
18.11.2005, 14:20
    #33386919
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок инициализации в классе
funikovyuriможет setModel() переопределить?
Дык само собой, переопределено, через тот же makeFilterModel - поэтому вариант, на котором я пока остановился, и работает :)

Вопрос в том, что во-первых не хочется понижать функциональность класса; если у предка есть конструктор с моделью, то и у потомка должен быть такой же, пока это имеет смысл. А во-вторых, из эстетства не хочется создавать временную модель, вся цель которой - позволить конструктору отработать.

Проверил в 1.4 - компилятор тоже по рукам за подобные шутки выдает.
Хм. Может быть, я в чем-то ошибаюсь. Факт, что эта ошибка начала проявляться при переползании на 1.5

И правильно делает.
Спорно. Имхо, вместо того, чтобы решить проблему, заметают ее дальше под кровать.

Можно сделать фабричный метод.
Не слишком удобно, поскольку нужна хорошая совместимость; практически нужно, чтобы во всех местах, где сейчас стоит new MyList, я мог бы поставить new MyFilteredList и быть уверенным, что все будет работать, ну и наоборот.
...
Рейтинг: 0 / 0
18.11.2005, 14:38
    #33386988
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок инициализации в классе
softwarer

а можно посмотреть код конструктора родительского класса?
...
Рейтинг: 0 / 0
18.11.2005, 15:21
    #33387153
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок инициализации в классе
funikovyuriа можно посмотреть код конструктора родительского класса?

Код: 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.
 class  BFilteredList  extends  BList {
   public  BFilteredList (ListModel dataModel) {
     super  ( new  Object[ 0 ]);
    setModel (dataModel);
      // здесь когда-то стоял super (makeFilterModel (dataModel))
  }

  ....

 class  BList  extends  JList {
   public  BList (ListModel dataModel) {
     super  (dataModel);
    init();
  }

  ....

 class  JList  extends  JComponent {
     public  JList(ListModel dataModel)
    {
         if  (dataModel ==  null ) {
             throw   new  IllegalArgumentException("dataModel must be non null");
        }

        // Register with the ToolTipManager so that tooltips from the
        // renderer show through.
        ToolTipManager toolTipManager = ToolTipManager.sharedInstance();
        toolTipManager.registerComponent( this );
        
        layoutOrientation = VERTICAL;

         this .dataModel = dataModel;
        selectionModel = createSelectionModel();
        setAutoscrolls(true);
        setOpaque(true);
        updateUI();
    }
...
Рейтинг: 0 / 0
18.11.2005, 16:53
    #33387454
marx_freedom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок инициализации в классе
Вот эмуляция данного случая.
Код: 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.
 public   class  A
{
	 public   static   void  main(String[] args)
	{
		C cc =  new  C();
		System.out.println("a");
	}
}

 public   class  B
{
         public  B()
	{
		set();
	}

	 public   void  set()
	{
		System.out.println("b");
	}
        
}

 public   class  C 
	 extends  B
{

	 public  C()
	{
		 super ();
	}

	 public   void  set()
	{
		System.out.println("c");
	}
}

На экран печатается ca.

Тут, как я понимаю, тоже самое. Во время работы конструктора
Код: plaintext
 super (makeFilterModel(model));
происходит вызов вашего переопределенного метода setModel.
так что я бы предложил сделать так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 class  BFilteredList 
     extends  BList 
{
     public  BFilteredList (ListModel dataModel)
    {
         super  (dataModel);
    }

     public   void  setModel (ListModel m) 
    {
         if  (! (m  instanceof  FilterModel))
             super .setModel( new  FilterModel(m));
         else 
             super .setModel (m);
    }



...

}
...
Рейтинг: 0 / 0
20.11.2005, 00:54
    #33388586
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок инициализации в классе
marx_freedom
Спасибо. Хорошая идея, но, боюсь, в этом случае не сработает.

marx_freedomВо время работы конструктора происходит вызов вашего переопределенного метода setModel.
Код: plaintext
1.
2.
3.
     public  JList(ListModel dataModel)
    {
        .....
         this .dataModel = dataModel;
...
Рейтинг: 0 / 0
20.11.2005, 13:58
    #33388708
marx_freedom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок инициализации в классе
softwarerв этом случае не сработает.
да.. надо было все же глянуть исходник перед предположением ;-)

тогда я бы остановился на приведенном выше переопределении setModel и таком конструкторе
Код: plaintext
1.
2.
3.
4.
5.
 public  BFilteredList (ListModel dataModel)
{
     super ();
    setModel(dataModel);
}

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


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