View Full Version : [JAVA] problema visualizzazione componenti in una finestra
Ciao a tutti. C'è una cosa che non capisco: quando scrivo un programma che ha della grafica (bottoni, textfield, ecc), succede questo...se io setto che la finestra non sia ridimensionabile, nel frame non si vede nulla...se la setto come resizable all'inizio non si vede niente, ma basta ridimensionare un attimo et voilà, i componenti appaiono tutti!
Non è normale sta cosa, non è che dimentico di invocare qualche metodo o qualcosa del genere?
banryu79
25-06-2009, 10:50
Non è normale sta cosa, non è che dimentico di invocare qualche metodo o qualcosa del genere?
Magari sì, c'è qualcosa di sbagliato, però per capirlo dovresti postare il codice di almeno un caso, così possiamo rendercene conto assieme.
Ah, forse c'è qualche concetto di base di Swing che ti sfugge o che ti è ancora poco chiaro: a tal proposito prova a dare un occhio a questo tutorial (http://www.hwupgrade.it/forum/showthread.php?t=2005654) (pdf, in italiano).
sostanzialmente mi succede con tutte le applicazioni, quindi suppongo di aver perso qualche dettaglio :D ti posto questo codice qui
package altro;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.event.*;
public class Altro extends JFrame{
public static void main(String [] args){
JFrame x=new JFrame("Pannello");
x.setSize(400, 400);
x.setVisible(true);
x.setResizable(true);
x.setContentPane(new Finestra());
x.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
public class Finestra extends JPanel{
JButton cambia_stato;
JLabel stato;
JLabel labx;
JLabel laby;
JFormattedTextField tfx;
JFormattedTextField tfy;
JPanel pannello;
public Finestra(){
this.setLayout(new GridBagLayout());
this.setBackground(Color.GRAY);
GridBagConstraints c=new GridBagConstraints();
cambia_stato=new JButton("Cambia stato");
cambia_stato.addActionListener(new Attiva());
c.fill=GridBagConstraints.BOTH;
c.anchor=GridBagConstraints.NORTH;
c.gridx=0;
c.gridy=0;
c.gridheight=1;
c.gridwidth=1;
c.insets.left=10;
c.insets.right=10;
c.insets.top=5;
add(cambia_stato,c);
stato=new JLabel("DISABILITATO");
c.fill=GridBagConstraints.BOTH;
c.gridx=1;
c.gridy=0;
c.gridheight=1;
c.gridwidth=1;
add(stato,c);
labx=new JLabel("X=");c.fill=GridBagConstraints.BOTH;
c.gridx=3;
c.gridy=0;
c.gridheight=1;
c.gridwidth=1;
add(labx,c);
tfx=new JFormattedTextField("");
tfx.setPreferredSize(new Dimension(20,30));
c.fill=GridBagConstraints.BOTH;
c.gridx=4;
c.gridy=0;
c.gridheight=1;
c.gridwidth=1;
add(tfx,c);
laby=new JLabel("Y=");
c.fill=GridBagConstraints.BOTH;
c.gridx=3;
c.gridy=1;
c.gridheight=1;
c.gridwidth=1;
add(laby,c);
tfy=new JFormattedTextField("");
tfy.setPreferredSize(new Dimension(20,30));
c.fill=GridBagConstraints.BOTH;
c.gridx=4;
c.gridy=1;
c.gridheight=1;
c.gridwidth=1;
add(tfy,c);
pannello=new JPanel();
pannello.setBackground(Color.WHITE);
pannello.setBorder(BorderFactory.createLineBorder(Color.black));
c.fill=GridBagConstraints.BOTH;
c.gridx=0;
c.gridy=2;
c.gridheight=5;
c.gridwidth=5;
c.ipady=200;
add(pannello,c);
repaint();
}
class Attiva implements ActionListener{
boolean isActive=false;
public void actionPerformed(ActionEvent e) {
if(isActive==false){
pannello.addMouseListener(new Puntatore());
isActive=true;
stato.setText("ABILITATO");
}
else {
isActive=false;
stato.setText("DISABILITATO");
}
}
}
class Puntatore implements MouseListener{
public void mouseClicked(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}
}
banryu79
25-06-2009, 11:35
Ok, ho letto velocissimamente il codice, ti espongo rapidamente le cose che non vanno bene, più tardi, appena trovo un po' di tempo, te le segnalo con più precisione negli spezzoni di codice.
Cose che non vanno:
1) ordine delle operazioni eseguite sul JFrame (nel metodo main)
viste le operazioni che esegui per concretizzare il tuo JFrame, setVisible() andrebbe invocata per ultima.
2) Thread di esecuzione delle operazioni eseguite sul JFrame (nel metodo main)
Il metodo main, entry point dell'applicazione, viene eseguito da un thread che non è l'EDT (Event Dispatcher Thread) ma le operazioni da eseguire realizzano un componente Swing, quindi deve essere l'EDT a eseguirle.
3) alla fine del costruttore della classe Finestra (un JPanel) c'è una chiamata a repaint(). Non dovrebbe essere neccessaria, non solo, la sua presenza in un costruttore "puzza".
Counsulta il tutorial che ti ho linkato prima: sono sicuro che ti chiarirà moltissimo le idee :)
intanto grazie mille della disponibilità :)
1. non sapevo che ci fosse un particolare ordine nella dichiarazione...spostando all'ultimo posto il metodo setVisible() effettivamente funziona tutto :)
2. sinceramente questo non l'ho capito :D cioè, proprio arabo
3. il repaint() l'ho chiamato per disperazione per vedere se era magari quella la causa del problema, poi mi sono dimenticato di eliminarlo vedendo che non cambiava nulla..effettivamente non ha nessun senso
il tutorial l'ho già scaricato e lo leggerò con molta attenzione! grazie dell'aiuto!
banryu79
25-06-2009, 11:49
2. sinceramente questo non l'ho capito :D cioè, proprio arabo
Si tratta di un aspetto fondamentale, che si deve conoscere se si programma in Swing. In pratica l'architettura di Swing è a thread singolo, quindi tutte le operazioni su componenti Swing vanno eseguite dallo stesso thread, che è l'EDT.
Ti risulterà tutto chiaro appena avrai letto le prime pagine di quel tutorial, la cosa è molto più semplice di quel che ti sembra adesso ;)
@EDIT:
1. non sapevo che ci fosse un particolare ordine nella dichiarazione...spostando all'ultimo posto il metodo setVisible() effettivamente funziona tutto
Specifico per maggiore chiarezza: nessun ordine particolare. In realtà è solo setVisible() che va chiamata per ultima in quel contesto.
Il perchè (setVisible() e pack() sono particolari, perchè la loro invocazione rende "visualizzabile" un componente, e quesot ha delle conseguenze) lo trovi spiegato sempre nelle prime pagine del tutorial succitato.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.