Swing Größe eines Buttons ändern

Rufus.Mueller

Bekanntes Mitglied
Moin,

ich will ein Fenster mit einem schönen kleinen Button in der Mitte haben. Der Button soll nicht die ganze Fenstergröße einnehmen wie er's bisher tut. Ich verwende keinen Layout-Manager. Wie kann ich die Größe des Buttons ändern?`Habe es mit den Methoden setBounds und setSize probiert, die hatten aber seltsamerweise gar keine Auswirkungen. ???:L

Gruß,
Rufus
 
Habe es zwar gerade nicht ausprobiert, aber versuch es doch mal mit setPreferredSize:

Java:
JButton button = new JButton("Dein Text");
button.setPreferredSize(new Dimension(200, 100));

EDIT: Wenn du tatsächlich keinen Layout-Manager verwendest (also setLayout(null)), dann sollte auch setBounds problemlos funktionieren. Wenn du das Layout gar nicht setzt, wird standardmässig das BorderLayout verwendet (daher füllt dein Button auch das ganze Frame).
 
Zuletzt bearbeitet:
setPreferredSize ging nicht, mit setBounds geht es jetzt aber, nachdem ich setLayout(null) eingesetzt hatte. Vorher hatte ich offenbar den default-Layout-Manager also BorderLayout. Ich weiß, dass es unerfreulich ist ohne Layout-Manager zu arbeiten. Ich bin blutiger Anfänger und versuche auf einfachstem Wege zu dem Ziel zu kommen das ich habe (im Moment ist es das, ein Fenster mit einem Startbutton in der Mitte zu erzeugen 😉). Wie bzw. mit welchem Layout-Manager würde man in dem Fall den professionell vorgehen?

Gibt es eine Möglichkeit mit setBounds den Button so zu setzen, dass er bei jeder Bildschirmgröße zentriert ist
 
Gibt es eine Möglichkeit mit setBounds den Button so zu setzen, dass er bei jeder Bildschirmgröße zentriert ist
Du kannst dir die Größe deines Frames geben lassen, die Position dann "per Hand" ausrechnen und per setBounds die Position setzen... oder eben mit LayoutManagern arbeiten 😉
 
(im Moment ist es das, ein Fenster mit einem Startbutton in der Mitte zu erzeugen 😉). Wie bzw. mit welchem Layout-Manager würde man in dem Fall den professionell vorgehen?
So in etwa, ohne groß rumrechnen zu müssen:
Java:
import java.awt.*;
import javax.swing.*;

public class CenterButtonDemo {
  public CenterButtonDemo(String title) {
    JFrame frame = new JFrame(title);
    frame.setSize(600, 400);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    JPanel panel = new JPanel(new GridBagLayout());
    JButton button = new JButton("Start!");
    panel.add(button);
    frame.add(panel);
    frame.setVisible(true);
  }
  
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new CenterButtonDemo("Los geht's!");
      }
    });
  }
}
Es so aufzubauen, macht nur in diesem Fall auf diese Weise Sinn, weil es sich nur um eine Komponente handelt. GridBagLayout ist an sonsten ein nicht ganz trivialer LayoutManager.
 
Sowas ist (m.M.) mehr als unschön.

Bei einen Null-Layout sollte sich ein setSize allerdings bemerkbar machen. Poste doch mal Bsp Code.

Da muss ich doch einmal nachhaken:

wieso genau ist es "unschön" ein AbsoluteLayout zu verwenden? Gibt es da technische Gründe oder so?
Ich selbst bin nämlich totaler Verfechter des AbsoluteLayouts.
Ich bekomme damit deutlich schneller deutlich "schönere" GUIs zusammengefrickelt, als wenn ich mir da den Stress mache und x-fach verschachtelte GUI Container und Components zusammenfrummeln muss.

Sicher, an einigen Stellen mache ich auch Gebrauch von anderen Layouts, aber ein Großteil der GUIs meiner Programme sind zu 99% mit AbsoluteLayout erstellt.

Um hier jetzt nich den Thread komplett zu hijacken, kannst mir eine Antwort gerne per PN schicken 😉.
 
Schonmal versucht bei nem null-layout die größe des fensters zu ändern? 😉
Was machst du wenn du viel darzustellen hast, deine GUI dementsprechend groß dimensionierst und der User dein Programm auf nem Netbook anschaut?
Andersrum is das ebenso möglich, ein User will das Fenster maximieren (um z.b. Tabellen größer darzustellen) und dann verhauts das Layout.
 
das geht doch auch "automatisch".
jedenfalls in den Anwendungsbeispielen die ich bis her geschrieben hatte (das soll nicht heißen, dass es auch Situationen geben kann wo das nicht mehr so einfach geht!).

Ich habe in einem Frame mindestens 1 Panel wo dann wiederum die einzelnen Komponenten rein kommen (oder verteilt auf mehrere Panels).
Die Komponenten wie z.b. Buttons haben bei mir dabei in der Regel eine feste Größe. Aber wenn ich dinge wie TextFelder, Labels, etc habe, kann man deren größe doch auf Basis der momentanen Framegröße (oder Größe des Parent Containers) berechnen.
Sicher, man muss dazu dann etwas zusätzlichen Aufwand betreiben, aber ich kommt damit immer noch schneller ans Ziel, als wenn ich mir überlegen muss, welche Layout Typen ich wie verschachteln muss, wenn ich diverse Komponenten auf dem Bildschirm anordnen will, einfach auf Grund der Möglichkeit, dass ich deren Positionen unabhängig und aufs Pixel genau definieren kann.

Hoffe es is klar was ich meine, tu mich da etwas schwer das mit Worten zu beschreiben 🙂.


Edit:
whoops den Part mit Netbook überlesen.
Mir wäre neu, wenn die LayoutManager die Components auch skalieren oO? Angenommen dein GUI hat so viele Bedienelemente, dass es nur sinnvoll visuell darstellbar ist wenn du beispielsweise einen mindesntes 800x600 Pixel großen Frame benötigst.
Wenn dann nun ein User halt noch einen 640x480 Monitor hat bezweifel ich, dass man da mit nem anderen LayoutManager mehr sehen würde oder etwa nicht?
Ich schreib die GUIs in der Regel so, dass sie eine mindestagröße von etwa 1024x768 benötigen (natürlich nur so fern es komplexere Geschichten sind).

Derzeit z.b. schreib ich an meiner Bachelorarbeit und benötige dafür ein recht umfangreiches GUI mit sehr vielen Bedienelementen und da hab ich auch das meiste mit AbsoluteLayout gemacht, vor allem bei den Buttons, CheckBoxes, Radiobuttons, etc.
Das einzige was dort mit nem BorderLayout gemacht wurde (bis jetzt) ist die Ebene meiner geschachtelten SplitPanes, welche sich dann durch die Gewichte den Platz im GUI bei nem Resize des Parent Frames korrekt einteilen.
Die Bedienelemente sollen ja (bis auf wenige Ausnahmen) gleich groß bleiben (will schließlich keinen 500x500 Pixel Button haben).
 
Zuletzt bearbeitet:
Alles immer selbst berechnen ist doch dann aber so, als würdest du das Rad neu erfinden, und das bei jedem Programm, das du schreibst. Und auch, wenn du deine GUI mal veränderst.
Mit richtig angewendeten LayoutManagern, wird dir da jedesmal eine Menge Arbeit abgenommen, zumal das dann auch auf allen Plattformen passt. Das kann ich mir für deine Layouts allerdings nur schwer vorstellen.
 

Zurück
Oben