2012-12-09 10 views
5

Ich habe eine JButton, die ich erweitern möchte, um die Größe einer JPanel, die es hält, zu füllen. Ich habe versucht, dies ein paar verschiedene Möglichkeiten zu tun, ohne Glück. Hier sind einige Versuche:Java: Erweitern Sie JButton, um Container zu füllen

  1. manuelle Größeneinstellung wie empfohlen here - Größe der Schaltfläche nicht ändern.

    panel = new JPanel(new CardLayout()); 
    button = new JButton(); 
    button.setPreferredSize(new Dimension(BUTTON_SIZE, BUTTON_SIZE)); 
    panel.add(button); 
    
  2. Der Versuch, eine BorderLayout zu verwenden, um den Knopf zu erweitern, wie bei here angedeutet. Größe hat sich nicht geändert.

    panel = new JPanel(new BorderLayout()); 
    button = new JButton(); 
    panel.add(button, BorderLayout.CENTER); 
    

ich falsch wahrscheinlich etwas zu tun, so ist jede Hilfe sehr geschätzt.

EDIT

Hier ist eine Zusammenfassung dessen, was es gelöst. Es gibt 2 Dinge, die

  1. Entfernen der Layoutmanager (in dem Aufruf von new JPanel) gearbeitet, die according to Oracle standardmäßig Border.
  2. Hinzufügen der Dimensionen zu dem Anruf wie in der akzeptierten Antwort (d. H. new BorderLayout(0,0)).
+0

Was wir brauchen, um tatsächlich zu sehen, was Sie mit dem Button 'panel' tun. Der zweite Versuch ist in der Theorie richtig. – MadProgrammer

Antwort

5

Ihr zweiter Versuch sollte funktionieren, aber das bedeutet nicht, das gesamte Top-Level-Container werden von der JPanel gefüllt werden, die Ihren JButton enthält. Wenn sich in einem BorderLayout Container keine weiteren Komponenten befinden, wird die mittlere Komponente erweitert, um den gesamten Container zu füllen.

http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html

Wenn das Fenster vergrößert wird, wird so viel von dem verfügbaren Raum wie möglich der Mittelbereich.

Können Sie ein Bild von dem, was Sie beim Ausführen Ihrer App sehen, posten? Hier ist ein Arbeitsbeispiel unten. Bemerkenswert ist, dass jeder Container bis ganz nach oben JFrame auch BorderLayout verwendet. Es ist möglich in Ihrem Versuch, dass einige obere Ebene Container die Größe Ihrer JPanel und damit auch die JButton innerhalb beschränkt.

frame = new JFrame(); 
frame.setBounds(100, 100, 450, 300); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

JPanel panel = new JPanel(); 
panel.setLayout(new BorderLayout(0, 0)); 
JButton button = new JButton("I'm a button!"); 
panel.add(button); 

frame.getContentPane().add(panel, BorderLayout.CENTER); 

enter image description here

+1

+1 yup es sollte von. und nettes Beispiel –

3

Scheint mir gut, wenn BorderLayout mit:

enter image description here

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

public class Test { 

    public Test() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(300, 300); 
      } 
     }; 
     panel.setLayout(new BorderLayout()); 

     JButton button = new JButton("Button"); 

     panel.add(button); 

     frame.add(panel); 

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

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test(); 
      } 
     }); 
    } 
} 

eine SSCCE Bitte senden Sie spezifische Probleme zu zeigen.

+2

+1 große Köpfe;) – MadProgrammer

+1

David, ein Tipp: Verwenden Sie alt + printScreeen, um einen Screenshot von * nur * der aktiven App zu erhalten. Du glaubst nicht, dass ich mir die Mühe mache, diese vielen Bilder, die ich gepostet habe, zu beschneiden, oder? ;) Siehe [Wie erstelle ich Screenshots?] (Http://meta.stackexchange.com/questions/99734/how-do-i-create-a-screenshot-to-illustration-a-post) für weitere Tipps. –

+1

@AndrewThompson danke und +1 gespeichert mir alotta Zeit für zukünftige Beiträge;) –

4

BorderLayout ist die einfachste Lösung.

Das Problem, das Sie wahrscheinlich haben, ist, wie das Eltern-Panel dann ausgelegt wird. Wenn Sie die Schaltfläche zu einem Panel hinzufügen, das BorderLayout verwendet, dann wird das Panel zu einem Panel hinzugefügt, das FlowLayout verwendet, führt nicht zu dem gewünschten Effekt.

enter image description here

public class ExpandButtonTest { 

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

    public ExpandButtonTest() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new JButton("I'm a big button")); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 
+0

+1 schön hehe :) –

Verwandte Themen