Dynamische Erstellung von buttons in Java
Ich versuche, dynamisch zu generieren, eine form. Im Grunde, möchte ich laden Sie eine Liste der Elemente für den Kauf, und erzeugen Sie eine Schaltfläche für jeden. Ich kann bestätigen, dass die buttons generiert werden, mit dem debugger, aber Sie werden nicht angezeigt. Dies ist innerhalb einer Unterklasse von JPanel
:
private void generate() {
JButton b = new JButton("height test");
int btnHeight = b.getPreferredSize().height;
int pnlHeight = this.getPreferredSize().height;
int numButtons = pnlHeight / btnHeight;
setLayout(new GridLayout(numButtons, 1));
Iterator<Drink> it = DrinkMenu.iterator();
for (int i = 0; i <= numButtons; ++i) {
if (!it.hasNext()) {
break;
}
final Drink dr = it.next();
b = new DrinkButton(dr);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
order.addDrink(dr);
}});
add(b);
}
revalidate();
}
DrinkButton
ist eine Unterklasse von JButton
. Irgendwelche Ideen?
Warum sind Sie der Einstellung b, um einen JButton, dann unten Einstellung es wieder zu DrinkButton
stellen Sie sicher, dass diese änderungen geschehen im Event-Dispatch-Thread
Der basic-code sieht gut aus. Sie sind mit revalidate (), die ein Schlüssel ist. Aber wir kennen nicht den Kontext, wie dieser code verwendet wird. Wir nicht, wenn diese Platte tatsächlich wurde Hinzugefügt, um den frame. Posten Sie Ihre SSCCE (sscce.org), die das problem veranschaulicht.
stellen Sie sicher, dass diese änderungen geschehen im Event-Dispatch-Thread
Der basic-code sieht gut aus. Sie sind mit revalidate (), die ein Schlüssel ist. Aber wir kennen nicht den Kontext, wie dieser code verwendet wird. Wir nicht, wenn diese Platte tatsächlich wurde Hinzugefügt, um den frame. Posten Sie Ihre SSCCE (sscce.org), die das problem veranschaulicht.
InformationsquelleAutor Kevin Lacquement | 2011-06-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Funktioniert auf meinem computer...
Soweit ich mich erinnere-Ihre version war so gut arbeiten, obwohl ich hatte zu entfernen, Ihre "Trink" - code. Starten Sie aus diesem Beispiel (es weist ein schönes Gitter von 4x4 Tasten) und bestimmen, was ist falsch mit Ihrem code.
JFrame
usw. in derEDT
Ich wusste nicht, über, dass, nahm ich einfach die erste Swing-tutorial habe ich gefunden, um den code laufen, es ist lange her, seit ich das Letzte mal in diesem Rahmen. Ich Schätze deine Bearbeitung, vielen Dank!
gerne helfen! 🙂
Gutes Beispiel, aber es hat nicht wirklich was mit der dynamischen Anforderung.
Es stellt sich heraus, dass mein problem war das einfädeln habe ich nicht
invokeLater()
.InformationsquelleAutor Tomasz Nurkiewicz
Können Sie
revalidate()
, wie in diesem Beispiel.Nachtrag: Hier ist meine variation auf @mKorbel interessant Antwort , zeigt ein ähnliches Ergebnis für
GridLayout
. Es sieht aus wierepaint()
kann notwendig sein, nachrevalidate()
.Ich Schätze Ihre Beobachtungen, erzählen mir immer wenn Sie sehen ein Ort, wo
repaint()
wäre besser.trashgod das ist über meine schnelle Hände, mein Fehler, Wenn ich lese, dass wieder (große Dummheit schrieb ich hier), ein großes sorry Mann, richtig gemeint "revalidate()" + repaint(), Stelle ich, für alle coumpound/composite JComponents f.e. JComboBox (oft mich Total wütend), zurück zu meiner Frage, warum hast ' N verwenden repaint();
Ah, wenn ich das richtig verstehe
revalidate()
nicht immer erfordern eine anschließenderepaint()
; für example.trashgod ja, das ist manchmal eigene Gefahr erforderlich/nicht erforderlich, dass die GUI für erfrischend, weil wir es verpasst, klare Beschreibungen aus der API wie/Wann/warum (re -) Validierung erforderlich repaint()
InformationsquelleAutor trashgod
Beispiel über validate() revalidate() plus repaint () Aussehen, die als erforderlich für die korrekte Ausgabe auf die GUI gelegt, indem einige der LayourManagers
EDIT: wie
trashgod
bemerkte, fügte ich Planen einen job ein, für die EDTweil ich immer noch sicher, dass, Aktion ist Threadsicher von Hörern 🙂
Leider ist die thread-sichere API verspricht schwindet, z.B.
append()
gegenappend()
.erhhhhttt ändern, dass Sie im Recht sind +1
und für Java7 ' s Swing Sie sind geplant zum entfernen von single-treten Regeln für EDT, das sieht aus wie eine gute Idee, auf den ersten Blick, aber mit aktuellen Java-Eigentümer(s) ....
InformationsquelleAutor mKorbel