PDA

View Full Version : [Java] posizionare componenti senza layout manager


ndakota
16-05-2009, 19:13
devo fare un piccolo progetto per la scuola. Posso fare qualsiasi cosa l'importante è che usi le socket. Siccome pensavo di farlo con interfaccia grafica sto facendo un po' di prove. faccio setLayout(null) nel JFrame però se cerco di posizionare i componenti con setBounds() non c'è verso che si spostino.

qualcuno mi sa aiutare?
al limite, c'è qualche layoutManager semplice da usare, adatto anche per progetti piccoli?

grazie :)

Energy++
16-05-2009, 20:15
io di solito inserisco all'interno del JFrame un JPanel impostato con setLayout(null)

esempio:

/* mainPanel */
JPanel mainPanel = new JPanel();
mainPanel.setLayout(null);


/* JFrame */
/*....
*/
this.getContentPane().add(mainPanel);


e poi posiziono i vari componenti con setBounds all'interno del panel

ndakota
16-05-2009, 20:42
guarda io ho questo codice


package socketproject;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

public class Gui extends JFrame
{
private static final long serialVersionUID = 4667623015432940473L;
private JPanel panel;
private ButtonDemo button;

public Gui()
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e)
{
System.err.println( "Errore di creazione Look&Feel" );
}

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(600, 400);
this.setLocation(300, 200);
this.setTitle("Provvisorio");
this.setLayout(null);

panel = new JPanel();
panel.setBackground(Color.LIGHT_GRAY);

button = new ButtonDemo("cliccami");
button.addActionListener(button);

panel.add(button);

this.add(panel);
this.setContentPane(panel);
}
}


visualizza il bottone ma se provo a spostarlo non c'è verso.. ho provato ad adattarlo al tuo ma niente, deve esserci una cosa che esclude un'altra.. addirittura nemmeno lo visualizza il bottone.

Energy++
16-05-2009, 20:59
modifica in questo modo:


package socketproject;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

public class Gui extends JFrame
{
private static final long serialVersionUID = 4667623015432940473L;
private JPanel panel;
private ButtonDemo button;

public Gui()
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e)
{
System.err.println( "Errore di creazione Look&Feel" );
}

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(600, 400);
this.setLocation(300, 200);
this.setTitle("Provvisorio");
//this.setLayout(null); //Va fatto sul panel

panel = new JPanel();
panel.setBackground(Color.LIGHT_GRAY);
panel.setLayout(null);

button = new ButtonDemo("cliccami");
button.setBounds(...); //Da sistemare
button.addActionListener(button);

this.getContentPane().add(panel);

panel.add(button);
}
}

ndakota
16-05-2009, 21:07
guarda, fatto così:


package socketproject;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

public class Gui extends JFrame
{
private static final long serialVersionUID = 4667623015432940473L;
private JPanel panel;
private ButtonDemo button;

public Gui()
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e)
{
System.err.println( "Errore di creazione Look&Feel" );
}

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(600, 400);
this.setLocation(300, 200);
this.setTitle("Provvisorio");

panel = new JPanel();
panel.setLayout(null);
panel.setBackground(Color.LIGHT_GRAY);

button = new ButtonDemo("cliccami");
button.setBounds(400, 300, button.getWidth(), button.getHeight());
button.addActionListener(button);

this.getContentPane().add(panel);

panel.add(button);
}
}


ma non si vede il bottone.. e una cosa, nel setBounds per x e y, devo tenere conto di dove è collocata la finestra?

Energy++
16-05-2009, 21:21
qui devi passare le coordinate x, y (che non dipendono dalla posizione della finestra) e la dimensione del pulsante width e height

button.setBounds(400, 300, button.getWidth(), button.getHeight());

ora non conosco la classe ButtonDemo e quindi non so cosa ritornano i metodi getWidth() e getHeight() (probabilmente ritornano 0 se il pulsante non si vede..) infatti se fai:

button.setBounds(400, 300, 80, 30);

il pulsante viene visualizzato correttamente (avendolo però precedentemente dichiarato come JButton, visto che non ho la classe ButtonDemo che usi tu)

ndakota
16-05-2009, 21:48
hai ragione :eek:
semplicemente ButtonDemo è una mia classe che deriva da JButton. io mettevo button.width e button.height perchè pensavo non avesse senso dare una dimensione e un'altezza quando comunque è fissa..

grazie comunque :)

PGI-Bis
16-05-2009, 22:14
Usa un IDE se vuoi realizzare un'interfaccia grafica e non hai il tempo di studiarne il layout.

Impostare il layout a null può sembrare una soluzione ma complica enormemente le cose.

ndakota
17-05-2009, 11:47
Usa un IDE se vuoi realizzare un'interfaccia grafica e non hai il tempo di studiarne il layout.

Impostare il layout a null può sembrare una soluzione ma complica enormemente le cose.

il problema è che è un progetto scolastico. e il prof lo gradirebbe tutto fatto a scrittura di codice.