2015-07-27 4 views
5

Sto lavorando su una GUI altalena e mi piacerebbe sovrapporre un pulsante a una barra di avanzamento. Ho già scritto il codice che aggiorna la barra di avanzamento e l'evento del pulsante, ma non so come gestire il layout!Come sovrapporre un Jbutton a una JprogressBar

attualmente il codice del pannello è la seguente:

public static void main(String[] args) throws IOException { 

     JFrame myFrame = new JFrame("myJfTitle"); 
     myFrame.setLayout(new BorderLayout()); 
     JPanel myPanel = new JPanel(); 
     JButton myButton = new JButton("Click me"); 
     JProgressBar myBar = new JProgressBar(); 
     myBar.setValue(50); 
     myPanel.add(myButton); 
     myPanel.add(myBar); 
     myFrame.add(myPanel,BorderLayout.CENTER); 
     myFrame.setVisible(true); 
} 

che dà il seguente risultato:

enter image description here

sto cercando senza successo di ottenere questo:

enter image description here

Can anyon e mi spieghi che tipo di Layout (o qualsiasi altra cosa) dovrei usare, o collegarmi lo stesso riferimento da cui posso leggere come farlo ??

UPDATE:

aggiungendo il seguente codice, sono riuscito a eccessivamente i 2 componenti, ma im ancora in grado di ingrandire la barra di avanzamento per adattarsi alle dimensioni del pannello:

LayoutManager overlay = new OverlayLayout(myPanel); 
myPanel.setLayout(overlay); 

risposta

8

prova con questo:

public class Test { 
    public static void main(String[] args) throws IOException { 

     JFrame myFrame = new JFrame("myJfTitle"); 
     myFrame.setLayout(new BorderLayout()); 
     JButton myButton = new JButton("Click me"); 
     myButton.setAlignmentX(Component.CENTER_ALIGNMENT); 
     JProgressBar myBar = new JProgressBar(); 
     LayoutManager overlay = new OverlayLayout(myBar); 
     myBar.setLayout(overlay); 
     myBar.setValue(50); 
     myBar.add(myButton); 
     myFrame.add(myBar, BorderLayout.CENTER); 
     myFrame.pack(); 
     myFrame.setSize(new Dimension(300,100)); 
     myFrame.setVisible(true); 
    } 
} 
+0

Perfettamente funzionante! Grazie! – Koop4

4

È possibile utilizzare GlassPane per questo (Appena visto l'aggiornamento, la vostra è anche corretto):

public class FTW { 
    public static void main(String[] args) throws IOException { 

     JFrame myFrame = new JFrame("myJfTitle"); 
     myFrame.setSize(300,100); 
     myFrame.setLayout(new BorderLayout()); 
     JPanel myPanel = new JPanel(); 
     JButton myButton = new JButton("Click me"); 
     JProgressBar myBar = new JProgressBar(); 
     myBar.setPreferredSize(new Dimension(myFrame.getWidth(),myFrame.getHeight())); //sets the size for the first time 
     myFrame.addComponentListener(new ComponentAdapter() //sets the size everytime the frame is resized 
     { 
       public void componentResized(ComponentEvent evt) { 
        Component c = (Component)evt.getSource(); 
        myBar.setPreferredSize(new Dimension(myFrame.getWidth(),myFrame.getHeight())); 
       } 
     }); 
     JPanel glass = (JPanel) myFrame.getGlassPane(); 
     glass.setVisible(true); 
     myBar.setValue(50); 
     glass.add(myButton, BorderLayout.CENTER); 
     myPanel.add(myBar); 
     myFrame.add(myPanel); 
     myFrame.revalidate(); 
     myFrame.repaint(); 
     myFrame.setVisible(true); 
} 
} 
4

In alternativa, si può semplicemente aggiungere il pulsante alla JProgressBar, per esempio ...

ProgressBar

JProgressBar pb = new JProgressBar() { 

    @Override 
    public Dimension getPreferredSize() { 
     Dimension size = super.getPreferredSize(); 
     Dimension dim = getLayout().preferredLayoutSize(this); 
     Insets insets = getInsets(); 
     dim.width += insets.left + insets.right; 
     dim.height += insets.top + insets.bottom; 
     size.width += insets.left + insets.right; 
     size.height += insets.top + insets.bottom; 
     return new Dimension(Math.max(size.width, dim.width), Math.max(size.height, dim.height)); 
    } 

}; 
pb.setBorder(new EmptyBorder(4, 4, 4, 4)); 
pb.setLayout(new GridBagLayout()); 
JButton btn = new JButton("Go boom"); 
btn.setOpaque(false); 
pb.add(btn); 

pb.setValue(50); 
add(pb); 

Ora, potrei essere temperato per creare un costume JProgressBar che potrebbe richiedere qualcosa come un Action e che comprendeva tutte queste funzionalità automaticamente;)