Ich blieb bei einem Projekt stecken, das ich in der Schule machen muss.Java ListCellRenderer und JList: Handle Auswahl
Ich habe versucht, eine benutzerdefinierte JList
für eine "einfache" UI zu erstellen: der Anwendungsfall sollte eine Liste von Bestellungen anzeigen und der Benutzer sollte in der Lage sein, einen zu wählen und zu setzen, wenn er/sie durch Drücken von zwei Tasten (lesen und getan), die auch als "unsetters" (ich verwende 2 boolean in der Klasse Order, die durch t, f, t, f ...) gehen. Wenn Sie auf Fertig klicken, sollte die ausgewählte Zeile grün werden (und dauerhaft auf dieser Farbe bleiben), bis die Schaltfläche "Fertig" erneut in dieser Zeile gedrückt wird (= nicht gesetzt). Das gleiche gilt für die Schaltfläche "Lesen", die die ausgewählte Zeile dauerhaft gelb machen sollte, bezogen auf das Flag "is_read" in der Klasse Order.
Nach einigen verwandten Beiträgen zu lesen, schrieb ich diesen Brauch 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;
}
}
Mein Problem ist, wenn hier meine Testdatei läuft, alles erscheint richtig, aber wenn ich eine Zeile auswählen und drücke ich einer von denen 2 Tasten nichts passiert, bis ich eine neue Zeile auswähle: dann wird die Farbe der Zeile, die ich auswähle, grün oder gelb (abhängig von der Taste, die ich gedrückt habe) angezeigt.
Ich bin mir ziemlich sicher, dass dies ein Problem mit meinem benutzerdefinierten CellRenderer ist, auch weil ich immer noch lerne, wie man es benutzt und ich begann ziemlich verwirrt zu werden.
Hier ist der Rest meines relevanten Codes in Bezug auf die Benutzeroberfläche, vielleicht ist es nützlich. Tasten und ihre Zuhörer sind in einer separaten Klasse (ein benutzerdefinierten JPanel
), aber das ist gut funktioniert, so ...
Klasse InitGraphics
(direkt von meiner Test-Klasse genannt):
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);
}
}
empfehle ich, nein, ich ** ** fordern Sie erstellen und veröffentlichen eine gültige [sscce] (http klar/lesen/done Schaltflächen enthält: // sscce.org) wenn Sie ernsthafte und schnelle Hilfe brauchen. Andernfalls ist Ihr Code für uns fast nutzlos und begrenzt unsere Fähigkeit, Ihr Problem zu verstehen. –
Zum Beispiel: keiner von uns kann diesen Code kompilieren oder ausführen.Wir möchten nicht Ihr gesamtes Programm sehen oder eine große Menge Code durchforsten, der für das Problem nicht relevant ist, aber wenn Sie Ihren Code auf das kleinste Beispiel verdichten könnten, das unmodifiziert kompiliert und ausgeführt wird, zeigt uns das Ihr Problem, und Das ist klein genug, um hier mit Ihrer Frage als Code-formatierten Text zu veröffentlichen, wir wären wahrscheinlich in der Lage, Ihr Problem ziemlich schnell zu lösen. –
Tut mir leid, schlechte Internetverbindung hier. Btw ich habe noch nie zuvor von Sscce gehört, aber ich habe versucht ... Nun, ich habe 140 Zeilen Code, was ich nicht für sehr geeignet halte, aber macht seinen Job. Nicht ein "Java-Veteran" Ich versuchte mein Bestes, ich lasse es hier mit einem [Pastebin] (http://pastebin.com/QUP0v8ke) einfach nicht um den bereits geposteten Code zu bearbeiten – A7X