Я застрял в проекте, который мне нужно делать в школе.Java ListCellRenderer и JList: выбор дескриптора
Я пытался создать пользовательский JList
для «простого» пользовательского интерфейса: в прецеденте должен отображаться список заказов, и пользователь должен иметь возможность выбирать его и устанавливать, если читать/делать, нажав две кнопки (читать и сделано), который действует также как «unsetters» (я использую 2 булевых в классе Order, которые продолжают идти через t, f, t, f ...). После нажатия «Готово» выбранная строка должна загореться зеленым цветом (и оставаясь постоянно на этом цвете) до тех пор, пока в этой строке не будет нажата кнопка «Готово» (= unset). То же самое в кнопке «Чтение», которая должна включать выбранную строку, постоянно желтую, относящуюся к флагу «is_read» в классе Order.
После прочтения некоторых соответствующие должности, я написал этот обычай ListCellRenderer
:
public class CookListCellRender extends JLabel implements ListCellRenderer<Order>{
public CookListCellRender(){
setOpaque(true);
}
@Override
public Component getListCellRendererComponent(JList<? extends Order> list, Order value, int index, boolean isSelected, boolean cellHasFocus) {
setLayout(new FlowLayout());
setText(value.getNameEl());
list.setVisibleRowCount(30);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setFont(new Font("Arial",Font.ITALIC,17));
if (isSelected) {
setBackground(Color.BLUE);
setForeground(Color.BLUE);
} else {
setBackground(getBackground());
setForeground(getForeground());
}
if(value.getOrderRead()){
setBackground(Color.YELLOW);
}else{
setBackground(Color.WHITE);
}
if(value.getOrderDone()){
setBackground(Color.GREEN);
}else{
setBackground(Color.WHITE);
}
return this;
}
}
Моя проблема в том, когда работает мой тестовый файл, все выскакивает правильно, но когда я выбираю строку и я нажимаю один из тех 2 кнопки ничего не происходит до тех пор, пока я не выберу новую строку: затем загорится зеленым или желтым (в зависимости от нажатой кнопки) цвет строки, которую я выбираю.
Я уверен, что это проблема, связанная с моим пользовательским средством визуализации ячеек, также потому, что я все еще изучаю, как ее использовать, и я начал очень растерянно.
Вот остальная часть моего соответствующего кода, связанного с пользовательским интерфейсом, может быть, это полезно. Кнопки и их слушатели находятся в отдельном классе (обычай JPanel
), но это работает отлично, так что ...
Класс InitGraphics
(непосредственно вызывается мой тестовый класс):
public class InitGraphics {
Cook c;
JList list;
public InitGraphics(Cook cuoco){
c=cuoco;
initUi();
}
private void initUi() {
JFrame frame = new JFrame("Cucina");
list =new JList(c.getOrdersCopy().toArray());
list.setCellRenderer(new CookListCellRender());
JScrollPane panel = new JScrollPane(list);
panel.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
panel.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
ButtonPanel buttonPanel = new ButtonPanel(c.getOrdersCopy(),list);
buttonPanel.setLayout(new FlowLayout());
frame.add(buttonPanel,BorderLayout.NORTH);
frame.add(panel,BorderLayout.CENTER);
frame.setVisible(true);
frame.setSize(600, 400);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
Я настоятельно рекомендую, не я ** не призываю ** создать и опубликовать действительный [sscce] (Http: // sscce.org), если вам нужна серьезная и оперативная помощь. В противном случае ваш код близок к бесполезным для нас и ограничивает нашу способность понимать вашу проблему. –
Например: никто из нас не может скомпилировать или запустить этот код.Мы не хотим видеть всю вашу программу или пробираться через большое количество кода, не относящегося к проблеме, но если вы можете сконденсировать свой код на самый маленький пример, который компилируется и запускается для нас без изменений, это показывает нам вашу проблему и который достаточно мал, чтобы опубликовать здесь свой вопрос в виде текста в формате кода, мы, скорее всего, сможем быстро решить вашу проблему. –
Прошу прощения, плохое подключение к Интернету здесь. Btw я никогда не слышал раньше о sscce, но я попытался ... ну, я получил 140 строк кода, который, я думаю, не очень подходит, но выполняет свою работу. Не будучи «ветераном java», я старался изо всех сил, я оставляю его здесь с помощью [pastebin] (http://pastebin.com/QUP0v8ke), чтобы просто не отредактировать уже опубликованный код. – A7X