2016-05-21 9 views
1

Ich habe den folgenden CodeJButton Maßstab all der Bildschirm

JFrame frame = new JFrame("Organizer"); 
    frame.setBounds(100, 100, 700, 700); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 


    JButton testbutton = new JButton("testbutton"); 
    testbutton.setBounds(0, 0, 55, 55); 

    JButton testbutton2 = new JButton("tdestbutton2"); 
    testbutton2.setBounds(55, 0, 44, 44); 

    frame.add(testbutton2); 
    frame.add(testbutton); 

und das Ergebnis manchmal richtig und manchmal ist diese enter image description here

, was im falsch?

Antwort

3

Was mache ich falsch?

  • Sie setBounds() nicht verwenden; Verwenden Sie eine layout manager.

  • Aufrufen setVisible()nach Hinzufügen von Komponenten zum umschließenden Container.

  • Konstruieren und manipulieren Sie Swing GUI-Objekte nur auf der event dispatch thread.

Das folgende Beispiel fügt eine Platte eine leere Grenze und ein GridLayout aufweist, der angepasst ist gepolstert. Beachten Sie für eine solche Anwendung auch JToolBar für die Schaltflächen und CardLayout für die Arbeitsbildschirme.

image

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

/** 
* @see http://stackoverflow.com/a/37366846/230513 
*/ 
public class Test { 

    private static final int PAD = 50; 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel p = new JPanel(new GridLayout(0, 1, PAD, PAD)); 
     p.setBorder(BorderFactory.createEmptyBorder(PAD, PAD, PAD, PAD)); 
     p.add(new JButton("Test Button 1")); 
     p.add(new JButton("Test Button 2")); 
     f.add(p, BorderLayout.CENTER); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Test()::display); 
    } 
} 
+0

Welche UI-Bibliothek, die Sie denken, ist besser? – dios231

+0

@ dios231: Außerhalb des Kontexts ist es schwer zu sagen; Ich bevorzuge fast immer einen verfügbaren Java-Geschmack (2D, AWT, SWT, Swing, FX) für plattformübergreifende Bequemlichkeit. – trashgod

3
testbutton.setBounds(0, 0, 55, 55); 
testbutton.setLocation(50, 50); 

testbutton2.setBounds(55, 0, 44, 44); 
testbutton2.setLocation(50, 100); 

Werden Sie jene Aussage befreien, weil dann nichts tun.

Sie tun nichts, da der Standardlayoutmanager für den Inhaltsbereich eines JFrame ein BorderLayout ist. Die BorderLayout setzt die Größe/Position jeder Komponente zurück.

Die BorderLayout erwartet, dass Sie eine "Einschränkung" angeben, wenn Sie die Komponente zum Rahmen hinzufügen. Wenn Sie die Einschränkung nicht angeben, wird "CENTER" verwendet. Es kann nur eine einzelne Komponente zu "CENTER" hinzugefügt werden, sodass nur die zuletzt hinzugefügte Schaltfläche angezeigt wird. Dies wird angezeigt, die Taste auf zwei Reihen

//frame.add(testbutton2); 
//frame.add(testbutton); 
frame.add(testbutton2, BorderLayout.PAGE_START); 
frame.add(testbutton, BorderLayout.PAGE_END); 

:

Eine einfache Lösung, die das Grundkonzept der Verwendung ein BorderLayout zu verstehen ist, zu verwenden.

Lesen Sie das Swing-Tutorial auf Layout Managers für weitere Informationen und Beispiele. Laden Sie den Demo-Code herunter und ändern Sie den Code, um den Swing-Konventionen zu folgen.

Sie müssen zum Beispiel Komponenten zum Rahmen hinzufügen, BEVOR Sie den Rahmen sichtbar machen. So sollte die Reihenfolge des Codes sein:

frame.add(...); 
frame.add(...); 
frame.pack(); 
frame.setVisible(true);