Button in Java Größe ändern

AT-AT

Cadet 4th Year
Registriert
Sep. 2020
Beiträge
84
Hi, ich programmiere im Moment einen Zufallsgenerator in Java mit Eclipse, der ein zufälliges Tier auswählt und will dem Zufallsgenerator eine Benutzeroberfläche machen. Die habe ich auch schon und jetzt will ich einen Knopf machen der, wenn ich ihn drücke, ein zufälliges Tier ausgibt. Der Knopf wird mir auch angezeigt allerdings bedeckt er das ganze Fenster. Ich habe sowohl mit setBounds(); als auch mit setSize(); probiert die größe zu ändern, aber es hat beides nicht funktioniert. Was mache ich falsch?

Hier der Code für den Button:
Java:
 //Button für den Zufallsgenerator
        JButton zufall = new JButton("Zufallstier");
        zufall.setBounds(300, 30, 80, 40);
        zufall.setVisible(true);
        zufall.setBackground(new Color(51, 102, 153));
        zufall.setForeground(Color.WHITE);
        zufall.setFocusPainted(false);
        
        jf.add(zufall);
    }
            
}
 
Erste Frage, warum benutzt du immernoch Swing und nicht FX?
Zweitens, kann es sein, dass du nach der Änderung der Größe auch die Oberfläche updaten musst?
Drittens, hat Eclipse keinen WYSIWYG-Editor für GUIs? Ich selbst arbeite nur mit Intellij und für JavaFX gibt es sowas.
 
Bin ziemlich neu im Programmieren und habe vor ein paar Tagen ein Tic Tac Toe Tutorial angeschaut und alles was er gemacht hat habe ich kopiert um die Grundkenntnisse zu verstehen und er hat es auch mit Swing gemacht (Das Video ist schon 4 Jahre alt), deshalb habe ich es auch so gemacht. Ich werde mich dann mal mit FX auseinandersetzen und es damit probieren, wenn das besser ist. Danke für deinen Kommentar.
 
setBounds wirkt sich je nach verwendetem LayoutManager anders - oder gar nicht - aus. Welcher LayoutManager wird verwendet? Der Code ist da nicht aussagekräftig.

BTW, Swing funktioniert immer noch wunderbar und hat den Vorteil Teil der Runtime zu sein. Bei JavaFX hast Du externe Abhängigkeiten, die auch noch plattformabhängig sind.
 
Ich bin zwar schon mehr als 12 Jahre von Java und Swing weg, aber da da ist doch ein Layoutmanagertyp als Default, oder?

Schau mal hier:

https://thebadprogrammer.com/swing-layout-manager-sizing/

Da liegt der Hase begraben.

Und jetzt noch mein Senf zu Swing vs JavaFX:

Schade, dass sich JavaFX nicht richtig durchgesetzt hat. Ich war so um 2014 (ab 2.0) richtig angetan. Nun ja, bin jetzt bei einem anderem GUI-Toolkit (Qt).

Bei Swing gab es doch das Problem bei den Textfeldern bei Copy und Paste unter Windows, oder? Netbeans war da schon immer so...na ja, nicht so prickelnd. Auch der Speicherdialog...JFileSaver JFileChooser? Weit weg von Usabillity.

Edit:
Zum Lernen und Hineinschnuppern ist es natürlich völlig legitim Swing zu benutzen.
 
Zuletzt bearbeitet:
Hier mal alle Codes die ich für den Zufallsgenerator bisher habe:

Main class:
Java:
package pack1;

public class Main {

    public static void main(String[] args) {
        new Gui();

    }

}

Zufallsgenerator:
Java:
package pack1;

import java.util.Random;

public class RandomGenerator {

    public static void main(String[] args) {
    
        String[] tiere;
    
        tiere = new String[] {"Hund", "Katze", "Maus", "Elefant", "Tiger", "Ratte"};
    
        Random zoo = new Random();
    
        int index = zoo.nextInt(tiere.length);
        System.out.println(tiere[index]);

    }
}

GUI:
Java:
package pack1;

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JButton;

public class Gui {
    
    JFrame jf;
    
    public Gui() {
        
        //Gui
        jf = new JFrame();
        jf.setSize (800, 600);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLocationRelativeTo(null);
        jf.setResizable(false);
        jf.setTitle("Zufallsgenerator");
        
        jf.setVisible(true);
        
        
        //Button für den Zufallsgenerator
        JButton zufall = new JButton("Zufallstier");
        zufall.setBounds(300, 30, 80, 40);
        zufall.setVisible(true);
        zufall.setBackground(new Color(51, 102, 153));
        zufall.setForeground(Color.WHITE);
        zufall.setFocusPainted(false);
        
        jf.add(zufall);
    }
            
}
 
JFrame nutzt standardmäßig BorderLayout - damit wirkt sich setBounds nicht aus. Man könnte das Layout nullen (jf.setLayout(null)), dann hätte man wohl das erwartete Ergebnis. Allerdings ist dies generell kein guter Ansatz, deswegen würde ich die Nutzung eines Layoutmanagers empfehlen.

Ich nutze fast ausschließlich MigLayout, sehr mächtig, braucht aber auch etwas Lernaufwand. Für den Anfang würde ich mit den vorhandenen Layoutmanagern Vorlieb nehmen: https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
 
  • Gefällt mir
Reaktionen: Xonical
Nur anmerkend... das wird so nicht funktionieren, weder mit den mehrfachen main()s noch mit dem system.out.* .

Ich "vermute" ja mal, daß die eine "main" eigentlich ein Konstruktor werden sollte und daß die Klasse RandomGenerator eher eine Klasse Zoo oder sowas sein sollte... in welchem Fall man new Zoo() instantiieren könnte und mit einer zu bauenden Methode getAnimal() ein zufälliges Tier aus dem Pool auswählen würde (beispielsweise).

Für GUIs aller Art werden dann Rückgabewerte von get**() Methoden benötigt. Oder halt Attribute mit ausreichendem Zugriffslevel (hier vermutlich readonly).

Mein Vorschlag wäre daher, zunächst Layoutfragen zurückzustellen und erstmal die Brücke schlagen vom Backend ("Tiere ermitteln") zum Frontend ("ermitteltes Tier in die GUI schreiben").

Der Rest kann dann danach kommen, wie margins, paddings, oder eben Blockgrößen.
 

Ähnliche Themen

Zurück
Oben