2012-12-09 9 views
5

Ho un JButton che mi piacerebbe espandere per riempire le dimensioni di un JPanel che lo trattiene. Ho provato a farlo in modi diversi, senza fortuna. Qui ci sono alcuni tentativi:Java: espandere JButton per riempire Container

  1. impostazione delle dimensioni manuale come raccomandato here - dimensione del pulsante non è cambiata.

    panel = new JPanel(new CardLayout()); 
    button = new JButton(); 
    button.setPreferredSize(new Dimension(BUTTON_SIZE, BUTTON_SIZE)); 
    panel.add(button); 
    
  2. Cercando di utilizzare un BorderLayout per espandere il tasto come suggerito here. Le dimensioni non sono cambiate.

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

Probabilmente sto facendo qualcosa di sbagliato, quindi ogni aiuto è molto apprezzato.

EDIT

Ecco un riassunto di ciò che risolto esso. Ci sono 2 cose che hanno funzionato

  1. Rimozione del LayoutManager (nella chiamata a new JPanel), che according to Oracle default BorderLayout.
  2. Aggiunta delle dimensioni alla chiamata come nella risposta accettata (ad esempio new BorderLayout(0,0)).
+0

Ciò di cui abbiamo realmente bisogno di vedere è quello che si sta facendo con il tasto 'panel'. Il secondo tentativo è corretto in teoria. – MadProgrammer

risposta

5

tuo secondo tentativo dovrebbe lavorare, ma questo non significa che l'intero contenitore di livello superiore verrà riempito dal JPanel che contiene il JButton. Quando non ci sono altri componenti in un contenitore BorderLayout, il componente centrale si espanderà per riempire l'intero contenitore.

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

Se la finestra è ingrandita, l'area centrale ottiene la maggior quantità di spazio disponibile il più possibile.

Puoi pubblicare un'immagine di ciò che stai vedendo quando esegui la tua app? Ecco un esempio di lavoro qui sotto. Una cosa che vale la pena di notare è che ogni contenitore fino alla cima JFrame utilizza anche BorderLayout. È possibile nel tuo tentativo che alcuni contenitori di livello superiore limitino le dimensioni del tuo JPanel, e quindi anche il JButton all'interno.

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 sì dovrebbe di. e buon esempio –

3

sembra che vada bene per me quando si utilizza BorderLayout:

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(); 
      } 
     }); 
    } 
} 

Si prega di inviare un SSCCE per mostrare problemi specifici.

+2

+1 grandi menti;) – MadProgrammer

+1

David, un consiglio: usa alt + printScreeen per ottenere uno screenshot di * solo * l'app attiva. Non pensi che io mi prenda la briga di ritagliare quelle decine di immagini che pubblico, vero? ;) Vedi [Come posso creare screenshot?] (Http://meta.stackexchange.com/questions/99734/how-do-i-create-a-screenshot-to-illustrate-a-post) per ulteriori suggerimenti. –

+1

@AndrewThompson grazie e +1 mi ha risparmiato tempo per i post futuri;) –

4

BorderLayout è la soluzione più semplice.

Il problema che si sta verificando probabilmente è il modo in cui viene visualizzato il pannello principale. Aggiungendo il pulsante a un pannello che utilizza BorderLayout e aggiungendo il pannello a un pannello che utilizza FlowLayout non si otterrà l'effetto desiderato.

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 nice hehe :) –