- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
static class CheckBoxCellRenderer extends JCheckBox implements ListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof CheckBoxListElement) {
CheckBoxListElement cblel = (CheckBoxListElement) value;
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}
else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
setSelected(cblel.isSelected());
setText(cblel.getText());
return this;
}
else {
throw new RuntimeException();
}
}
}
RaZeR 28.09.2011 14:24 # 0
>setForeground(list.getSelectionForegrou nd());
Всё это решается путём вызова нативного метода setBackgroundToBackgroundFromColorToSame Color(list);
Teddy_Brown 28.09.2011 14:41 # +2
absolut 28.09.2011 23:33 # 0
Lure Of Chaos 28.09.2011 21:36 # 0
он еще и вложенный
RaZeR 28.09.2011 22:46 # −1
absolut 28.09.2011 23:35 # −1
tir 29.09.2011 08:25 # 0
absolut 29.09.2011 10:04 # −2
tir 29.09.2011 08:29 # 0
Я бы даже instanceof в такой ситуации не делал, сразу бы кастил.
wvxvw 29.09.2011 12:14 # 0
Еще интересно было бы увидеть как Java компилятор разобрался бы с неожиданным return.
roman-kashitsyn 29.09.2011 12:30 # +1
Если там написать другой тип, то код не скомпилится, т.к. класс не будет реализовывать интерфейс ListCellRenderer, метод интерфейса будет перегружен, но не определён.
> как Java компилятор разобрался бы с неожиданным return
и что в нём такого неожиданного? вы вздрогнули?
wvxvw 29.09.2011 12:47 # 0
Неожиданный потому, что функция формально должна вернуть значение в конце. Но если ее дословно переписать в байткод, то в конце получется недосягаемый участок с return <и тут не понятно что>. Т.е. компилятору нужно будет сообразить, что return, который написал программист не нужен, и его нужно выбросить, и точно такой же вставить вместо мертвого кода вконце.
roman-kashitsyn 29.09.2011 13:00 # +1
нет, очень многие наступают на грабли, реализуя equals(MyClass) вместо equals(Object)
> функция формально должна вернуть значение в конце
функция может вернуть значение когда угодно. Никаких недосягаемых участков кода я не вижу.
roman-kashitsyn 30.09.2011 16:46 # +1
Попробуйте оценить сами абсурдность обратного поведения. Тот, кто вызывает метод интерфейса, ожидает, что интерфейс будет работать с каким-то более общим типом к примеру, Object. Узкоспециализированный метод не может служить реализацией, ибо он нарушает контракт.
wvxvw 29.09.2011 12:52 # 0
roman-kashitsyn 29.09.2011 13:02 # +1
wvxvw 29.09.2011 13:27 # 0
А перегружать методы с какой версии можно было?
все-таки лучше было бы.
roman-kashitsyn 29.09.2011 13:35 # +1
wvxvw 29.09.2011 14:53 # −1
roman-kashitsyn 29.09.2011 14:58 # 0
wvxvw 29.09.2011 17:03 # −1
Компилятор сгенерирует код, который вызовет Если да, то в чем смысл перегрузки?
roman-kashitsyn 29.09.2011 17:12 # +2
Идея в том, что CheckBoxCellRenderer будет передаваться в качестве отрисовщика элементов списка стандартному компоненту Swing. При этом для стандартного компонента Swing этот отрисовщик будет представляться как реализация интерфейса ListCellRenderer, у которого есть только один полиморфный метод getListCellRendererComponent(JList, Object...). Поэтому о поиске наиболее подходящей функции речь тут даже не идёт. Перегрузка в Java работает примерно так же, как она работает в C# и С++.
wvxvw 29.09.2011 17:42 # −2
roman-kashitsyn 29.09.2011 17:52 # +1
> при наличии метода принимающего A
в том то и суть, что метод принимает не A, а интерфейс С. Об A он и знать не знает. И вызываться будут методы C, а не перегруженные методы A.
wvxvw 30.09.2011 03:09 # 0
gegMOPO4 30.09.2011 14:00 # +1
wvxvw 01.10.2011 13:32 # 0
http://pastebin.com/zB4HjmkT
Мне такой подход видится логичным. Если в Java это не так... то можно только руками развести.
CPPGovno 01.10.2011 15:06 # 0
http://ideone.com/TbuuO
gegMOPO4 01.10.2011 16:13 # +2
SmackMyBitchUp 30.09.2011 10:58 # 0
Наверное, он не понимает зачем и как были придуманы интерфейсы
gegMOPO4 29.09.2011 19:52 # 0
absolut 29.09.2011 21:26 # +3
gegMOPO4 29.09.2011 19:51 # 0
wvxvw 30.09.2011 02:58 # 0
gegMOPO4 30.09.2011 13:57 # +1
roman-kashitsyn 30.09.2011 14:00 # +2
wvxvw 01.10.2011 12:45 # −4
SmackMyBitchUp 01.10.2011 14:25 # 0
gegMOPO4 01.10.2011 16:12 # 0
CPPGovno 01.10.2011 18:32 # 0
dwinner 29.09.2011 14:49 # 0
CheckBoxListElement - явно какой-то user class, что-то там инкапсулирует и используется тут как модель.
RuntimeException "бросать" - явно плохой стиль, лучше убрать extends JCheckBox и сделать JToggleButton в виде
композитного объекта, а экстендить DefaultListCellRenderer, тогда логично в else-ветке просто написать:
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus) и голову себе не ломать...
gegMOPO4 29.09.2011 19:47 # 0
Если JCheckBox не наследовать в этом классе, всё равно скорее всего придётся наследовать в ещё одном внутреннем, чтобы переопределить некоторые методы. И ничему это не поможет, класс и так внутренний и скрытый.
guest8 09.04.2019 11:37 # −999