Java Gui designen - ProgressBar, ActionListner in ActionListner und Buttons beschriften?

FrazeColder

Lt. Commander
Registriert
Okt. 2013
Beiträge
1.721
Moin Community,

Ich hätte da drei Fragen zu Java bzw. zu einer GUI. Momentan implementiere ich eine GUI mit IntelliJ und einem GridBagLayout.

1. Ich habe eine ProgressBar, die ich gerne für x Sekunden ablaufen lassen würde. Allerdings wenn ich das prozentual mache, dann läuft die Bar mit leider zu langsam ab...
Kann man die irgendwie "flüssig" ablaufen lassen und wenn ja, wie?

2. Kann man einen ActionListner in einen ActionListner packen?
Sprich, dass der User erst auf einen Button klicken muss und wenn er danach irgendwo auf Fenster klickt, dass dann erst was passiert?
Und nicht wenn nur der Button oder nur irgendwo auf dem Fenster geklickt wird?

3. Wie kann ich Buttons so beschrieften, dass diese so aussehen? - Sprich mit Bild(Icon) UND Schrift?:
http://ideen-aus-dem-netz.de/wp-content/uploads/2014/05/Quizduell201.png


MfG und Vielen Dank
 
Hey,

deine Erste frage verstehe ich nicht ganz.
Willst du eine ProgressBar haben die in genau x Sekunden durchläuft und wie du das anstellst?

Da wäre meine Idee eine Loop zu bauen die alle x/100 einen Prozent erhöht wird. Würde ich in einem 2. Thread laufen lassen, da sonst der Rest des Fensters auch pausiert wird.. Gibt sicherlich auch noch andere Lösungen.

2. Ja das kannst du machen. Mir fällt spontan auch nicht ein wie man es besser man könnte.

3. JButton hat einen Konstruktor mit Icon und Text. Musst du mal durchprobieren.
JButton doc
 
Hi FrazeColder,

Wie genau hast du dich schon mit dem Aufbau von GUI-Anwendungen in Java beschäftigt? Die Herangehensweise unterscheidet sich nämlich deutlich zwischen AWT/Swing und JavaFX. Empfehlen kann ich nur die Nutzung von JavaFX.

Da ich nicht weiß, welches Framework du nutzen willst, kann ich die Fragen nur sehr oberflächlich beantworten.

1. ProgressBar

Eine ProgressBar wird für gewöhnlich nur benötigt, wenn eine Berechnung relativ lange dauert. In diesem Fall sollten auf jeden Fall Hintergrundthreads für die Berechnung verwendet werden. Für JavaFX gibt es hier ein sehr einfaches Beispiel, wie man einen solchen Worker erstellt und damit eine ProgressBar aktualisiert. Führt den Hauptthread die aufwändige Berechnung durch, so wird das GUI einfrieren und sich nicht ordentlich aktualisieren.

2. ActionListner

Ich weiß jetzt nicht, wie man ActionListner ineinander packen sollte. Was du machen willst lässt sich wesentlich eleganter lösen. Der Zustand deines GUI sollte über ein Objekt repräsentiert werden. Wird der ActionListner eines Button aktiviert, so wird dies als Zustandsänderung in dem Objekt vermerkt (z. B. als einfacher Boolean-Wert). Der zweite ActionListner überprüft, ob die Voraussetzung für eine Reaktion erfüllt sind (der Boolean-Wert wurde vom ersten ActionListner auf true gesetzt). Ist die nicht der Fall, dann passiert einfach nichts.

3. Buttons mit Bild und Schrif

Bei Swing nimmt der Konstruktor von JButton zusätzlich zum Text ein Icon entgegen. Bei JavaFX hast du noch viel mehr Möglichkeiten, da du das Aussehen deiner Anwendung mit Hilfe von CCS modifizieren kannst.
 
Ich bin leider gezwungen, AWT/Swing zu benutzt... - Daher beleibt mir nichts anderes übrig...

In meiner GUI soll die ProgressBar den Ablauf einer Zeit darstellen. Finde ich schöner, als ein Counter. Bisher habe ich das, so wie thinkpadx geschrieben hat realisiert: "Da wäre meine Idee eine Loop zu bauen die alle x/100 einen Prozent erhöht wird".
Allerdings ist das Problem, dass das sehr stockend ist... Bei 20s habe ich z.B. pro Sekunde 5%. Aber das ist viel zu viel. Mir wäre es lieber, wenn es so schnell ist, dass es Flüssig ist! -

Stimmt, kann das auch so machen :) - Vielen Dank!

Ok, schau ich mir mal an! - Danke!

Eine Frage bleibt mit aber noch. Wie kann ich den einen Pfad in Java benutzten, der nicht absolut ist. Damit, wenn ich mein Projekt wo anderes zeige, und dadurch mein USB Stick einen anderen Laufwerkpfad hat, das Bild dennoch geladen wird. Aber wie macht man das?
 
Also irgendwie bekomme ich es nicht hin. Habe das jetzt schon länger probiert, aber er will net...

Unbenannt.JPG

Fehlermeldung: Cannot resolve Constructoer ImageIcon
 
Nicht im src ordner!
src steht fuer Source, wenn man jetzt nachdenkt merkt man das Ressourcen keine Source ist, sprich kein Code, also einen Ordner "rsc" im Verzeichnis von src erstellen und dann hast du es.

So dass du dann eine solche Ordner Struktur hast:

Code:
NameDesProjekts
|
+-.idea
+-out
+rsc
+src


Desweiteren wurde ich mal mit ALT+ENTER bei dem rot unterkringelten Code-Stueck wissen was der von dir will.
Hat sich erledigt. Nicht richtig gelesen.

//EDIT
Nochetwas
Klassen GROSS
Alles andere klein

Und warum Swing, wenn man JavaFX hat?
 
Zuletzt bearbeitet:
FrazeColder schrieb:
Also irgendwie bekomme ich es nicht hin. Habe das jetzt schon länger probiert, aber er will net...

Fehlermeldung: Cannot resolve Constructoer ImageIcon

Welche Parameter-Typen erwartet der Konstruktor? Welchen Typ liefert getResourceAsStream()?

Hint: Hat java.lang.Class vielleicht eine andere Methode, die einen passenden Typ liefert?
 
Also irgendwie will er immer noch nicht...
Unbenannt.JPG

Und da fällt mir noch eine zweite Frage ein.
Wie kann ich einen Button, in verschiedenen Schriftgrößen beschriften, Zeilenumbrüche verwenden und Images einfügen?


EDIT 20:33: Mit der Zeile hier gehts jetzt doch!
Code:
        back.setIcon(new ImageIcon(getClass().getResource("/assets/back.jpg")));
 
Zuletzt bearbeitet:
FrazeColder schrieb:
Allerdings ist das Problem, dass das sehr stockend ist... Bei 20s habe ich z.B. pro Sekunde 5%. Aber das ist viel zu viel. Mir wäre es lieber, wenn es so schnell ist, dass es Flüssig ist!

Das ist nicht das Problem..
Code:
Thread.sleep(int milisec)
nimmt als Argument eh Milisekunden an. Also bei 20sec wäre das dann alle 0,2sec eine Erhöhung um 1%.

Aber du musst es echt in einem 2. Thread ausführen, da sich sonst auch die GUI mit aufhängt.


FrazeColder schrieb:
Und da fällt mir noch eine zweite Frage ein.
Wie kann ich einen Button, in verschiedenen Schriftgrößen beschriften, Zeilenumbrüche verwenden und Images einfügen?

Zeilenumbrüche: stackoverflow zeilenumbruch

Schriftgröße: Stockoverflow

Das heißt du kannst den JButton auch mit html formatieren.

Das Bild hast du ja mit dem Icon schon eingefügt. Eine andere Methode geht meines Wissens nicht.


kleiner Tip von mir: sehr viele Fragen gibt es schon auf stackoverflow.com
Wenn du die Fragen auf englisch googlest sind die meistens der erste Link ;)
 
Zuletzt bearbeitet:
Alles Klar, VIELEN DANK euch!
Ergänzung ()

Ok, da kommt doch wieder eine Frage auf... - Hab dazu auch nichts gefunden...

Ich füge das einfach so in den JButton ein. Allerdings kann ich die Reihenfolge leider nicht bestimmen... - Wie kann ich den sagen, dass der Pfeil, also das Icon, rechts vom Text sein soll?

Unbenannt.JPG
 
Dafür könntest Du einen eigenen UI-Delegate setzen:

Code:
JButton#setUI(ButtonUI)

Ich persönlich würde keine Informationen im Button anzeigen...
 
Da muss ich jetzt zugeben, ich weiß leider nicht genau, was du damit meinst... :/
 
Was vielleicht auch funktioniert, wäre mittels

Code:
Component#setComponentOrientation(ComponentOrientation)

die Orientierung zu ändern. Damit hatte ich noch nie zu tun, aber ich würde annehmen, dass sich damit die gewünschte Anordnung erzielen lassen müsste.

Mittels UI-Delegate hat man halt komplett freie Hand.
 
Zurück
Oben