MyFinestra
Questo programma è importante perchè ci fa capire come funziona il borderLayout.
Ho chiesto
Due versioni:
Fig-1 Fig-2
 
Codice base:
Classe: MyFinestra |

|
1 package myfinestra;
2
3 import javax.swing.*;
4 import java.awt.*;
5
6 public class MyFinestra {
7 public static void main(String[] args) {
8 SwingUtilities.invokeLater(() -> new Finestra());
9 }
10 }
11
12 class Finestra extends JFrame {
13 public Finestra() {
14 setTitle("Finestra con Bottone");
15 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
16 setSize(400, 300);
17 getContentPane().setLayout(null);
18 setLocationRelativeTo(null);
19 Color customBackgroundColor = new Color(255, 255, 255);
20 getContentPane().setBackground(customBackgroundColor);
21 setVisible(true);
22
23
24 JButton bottone = new JButton("Clicca qui!");
25
26
27 JPanel pannello = new JPanel();
28 pannello.setBackground(Color.red);
29 pannello.setBounds(50, 50,150, 50);
30 pannello.add(bottone);
31 add(pannello);
32 }
33 } |
Il codice sopra si riferisce alla fig. 1 Alla riga 17 abbiamo: getContentPane().setLayout(null);
Mentre il codice che si riferisce alla Fig. 2 è identico a quello qui riportato ma ha invece la riga sopra commentata (//) (che vuol dire disattivata): //getContentPane().setLayout(null);
Quando si crea una finestra il compilatore assegna al suo contentPain per default un managerLayout di tipo BorderLayout.CENTER, e non essendoci nessun altro Layaout questo si espande su tutta la finestra.
Quando (Fig.2)
ChatGpt:
Il motivo per cui il pannello e il bottone non sono visibili nel codice originale è legato all’utilizzo del layout manager per il content pane della finestra.
Ecco cosa accade nel codice originale:
- Quando crei una JFrame, di default viene utilizzato un layout manager (solitamente BorderLayout) per disporre i componenti all’interno del content pane.
- La riga getContentPane().setLayout(null); imposta il layout manager del content pane a null (cioè nessun layout manager).
- Quando aggiungi i componenti (come il JPanel o il JButton) al content pane, il layout manager determina la loro posizione e dimensione.
- Poiché non c’è un layout manager, il JPanel e il JButton non vengono posizionati o dimensionati automaticamente. Hanno una dimensione predefinita (0x0) e sono sovrapposti nell’angolo in alto a sinistra del content pane.
- Le dimensioni del JPanel vengono impostate esplicitamente con pannello.setBounds(50, 50, 150, 50), posizionandolo a (50, 50) con una dimensione di 150x50 pixel.
- Tuttavia, le dimensioni del JButton non vengono impostate esplicitamente, quindi rimane alla sua dimensione predefinita di 0x0 e non è visibile.
Per risolvere questo problema, puoi fare una delle seguenti cose:
- Utilizzare un layout manager: Imposta un layout manager diverso (ad esempio FlowLayout, GridBagLayout, ecc.) anziché impostarlo a null. In questo modo, il layout manager gestirà il posizionamento e le dimensioni dei componenti.
- Impostare le dimensioni esplicite per entrambi i componenti: Se vuoi continuare a utilizzare null come layout manager, assicurati di impostare le dimensioni esplicite sia per il JPanel che per il JButton.
Io:
Se vedi il codice originale noterai che non ho dato nessuna dimensione al bottone. Tu hai detto:
"Tuttavia, le dimensioni del JButton non vengono impostate esplicitamente, quindi rimane alla sua dimensione predefinita di 0x0 e non è visibile"
Ed invece il bottone è visibile, come mai?
ChatGpt:
Nel caso che ci sia il layout attivo allora:
Il bottone è visibile anche senza dimensioni esplicite perché il layout manager di default (nel caso del JFrame) è BorderLayout, che gestisce automaticamente le dimensioni dei componenti.
Nel codice originale, quando aggiungi il bottone al content pane, il layout manager BorderLayout lo posiziona automaticamente al centro del content pane e gli assegna le dimensioni disponibili. Pertanto, anche senza impostare esplicitamente le dimensioni del bottone, viene visualizzato correttamente.
Se invece il layout è Null:
- La riga getContentPane().setLayout(null); imposta il layout manager del content pane a null, disabilitando qualsiasi posizionamento e dimensionamento automatico dei componenti.
- Il JPanel con sfondo rosso viene creato e posizionato a (50, 50) con una dimensione di 150x50 pixel utilizzando pannello.setBounds(50, 50, 150, 50).
- Il JButton (“Clicca qui!”) viene aggiunto al JPanel (che è l’unico componente nel content pane).
- Poiché non c’è un layout manager, il JButton non viene posizionato o dimensionato automaticamente.
- Tuttavia, il JButton ha delle dimensioni predefinite che gli permettono di essere visibile all’interno del JPanel, ma queste dimensioni non sono legate a quelle del pannello. Di solito, un JButton ha una dimensione sufficiente per contenere il testo che vi è inserito, più un po’ di spazio perimetrale per l’aspetto estetico.
- Di conseguenza, il JButton è visibile e centrato all’interno del pannello rosso, anche se non viene impostata esplicitamente una dimensione per il bottone.
|