PDA

View Full Version : [Java] Inserire componenti in un JFrame


Alhazred
28-06-2007, 15:17
Salve, sto iniziando a mettere mano alla grafica con Java ed ho questo problema:
come faccio ad inserire ad esempio un disegno (anche solo una linea) e un JRadioButton all'interno dello stesso JFrame?
Con questo codice riesco a mettere un disegno nel JFrame, ma se devo aggiungere un JRadioButton non so come fare, ho provato, ma non riesco a visualizzarlo:

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Color;

public class Prova extends JFrame{

public Prova(){
super("Prova");
getContentPane().add(new Pannello());
int distx = 200;
int disty = 100;
int larghezza = 640;
int altezza = 480;
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(distx, disty);
setSize(larghezza, altezza);
}

class Pannello extends JPanel{
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.WHITE);
g.fillRect(140, 230, 40, 150);
g.setColor(Color.BLACK);
g.drawRect(140, 230, 40, 150);
}
}

public static void main(String[] args){
Prova disegna = new Prova();
}
}

PGI-Bis
28-06-2007, 16:59
Il componente predefinito che un JFrame usa come pannello del contenuto ha un LayoutManager di tipo BorderLayout.

L'ìnserimento di un componente in contenitore dotato di un BorderLayout in assenza di parametri equivale all'inserimento al centro.

Cioè:

getContentPane().add(new Pannello());

equivale a:

getContentPane().add(new Pannello(), BorderLayout.CENTER);

Inserire un diverso componente in una "zona già occupata", come accadrebbe se noi dicessimo:

getContentPane().add(new Pannell()); //CENTER
getContentPane().add(new JButton()); //ancora CENTER

causa la sostituzione del componente già inserito con il nuovo e non l'aggiunta del secondo al primo.

Puoi inserire un altro componente nel pannello del contenuto scegliendo una delle altre quattro direzioni (BorderLayout.NORTH, SOUTH, EAST, WEST).

Ad esempio:

getContentPane().add(new JButton("hello"), BorderLayout.SOUTH);

Non è detto che la distribuzione degli spazi offerta da BorderLayout ti soddisfi. In questo caso dovrai usare un diverso LayoutManager.

Di solito non si cambia il LayoutManager del pannello del contenuto di un JFrame ma si crea un nuovo contenitore che faccia da intermediario.

Ad esempio:

JPanel contenitore = new JPanel(new GridLayout(2, 1));
contenitore.add(new Pannello());
contenitore.add(new JButton("hello"));

getContentPane().add(contenitore); //contenitore finisce al centro

Ma non è una regola. Si fa perchè il LayoutManager BorderLayout offre una distribuzione degli spazi che è tipica delle applicazioni a finestra.

Sopra c'è una barra degli strumenti, sotto una barra di stato, a destra o sinistra si possono mettere dei pannelli serventi e al centro di va l'area di lavoro con tutti i suoi ammennicoli.

Così il contenitore ad hoc diventa l'area di lavoro e si lasciano aperte le posizioni NORTH, SOUTH, EAST, WEST per il resto.

Alhazred
28-06-2007, 17:47
Grazie per la risposta.
Credo di aver capito cosa mi stai dicendo, ma questo dovrebbe essere vero se io costruissi più pannelli, mentre sto inserendo i JRadioButton a seguito del codice che costruisce il rettangolo (equivale a mettere un altro pannello?), cosa che mi fa sparire il rettangolo e comparire solo i bottoni... proprio come dici tu, quindi nonostante abbia capito il tuo discorso devo avere un po' di confusione in testa.
Potresti modificare il codice che ho scritto in modo che vengano visualizzati 2 JRadioButton e il rettangolo? Magari vedendolo scritto riesco a chiarirmi le idee.

PGI-Bis
28-06-2007, 18:25
Li ho messi in fondo.

import javax.swing.*;
import java.awt.*;

public class Prova extends JFrame{

public Prova(){
super("Prova");

JRadioButton buttonOne = new JRadioButton("hello one");
JRadioButton buttonTwo = new JRadioButton("hello two");
JPanel buttonContainer = new JPanel(new GridLayout(2, 1));
buttonContainer.add(buttonOne);
buttonContainer.add(buttonTwo);
add(buttonContainer, BorderLayout.SOUTH);

getContentPane().add(new Pannello());
int distx = 200;
int disty = 100;
int larghezza = 640;
int altezza = 480;
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(distx, disty);
setSize(larghezza, altezza);
}

class Pannello extends JPanel{
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.WHITE);
g.fillRect(140, 230, 40, 150);
g.setColor(Color.BLACK);
g.drawRect(140, 230, 40, 150);
}
}

public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable() { public void run() {
Prova disegna = new Prova();
}});
}
}

In concreto bisognerebbe vedere la bozza dell'interfaccia per capire quali LayoutManager usare e come usarli.

Alhazred
28-06-2007, 19:26
Io cercavo di mettere il codice dei bottoni di seguito alla costruzione del rettangolo, non ci avevo proprio pensato a provare come hai fatto tu. Grazie :)

In pratica il programma che sto scrivendo deve avere tre o quattro pulsanti che si escludano a vicenda (da qui la decisione di usare dei JRadioButton) in modo che appaia una figura diversa all'interno del rettangolo (che farò più grande) a seconda del pulsante scelto.
Lo so che è un programma che non ha molto senso :p

Edit: è possibile invece di usare griglie e posizioni north, south... specificare direttamente le coordinate di dove si vuole ogni componente?

lovaz
29-06-2007, 09:07
Edit: è possibile invece di usare griglie e posizioni north, south... specificare direttamente le coordinate di dove si vuole ogni componente?

Con il layout GridBag, leggiti il tutorial di PGI-Bis