Setvisible lo fa sparire, dovresti usare la dispose, ma usarla dopo che ti sei connesso se vuoi farla sparire dopo la connessione, per cui a occhio la dispose la devi chiamare su this nel listener della connessione (bottone di connessione)
Printable View
Setvisible lo fa sparire, dovresti usare la dispose, ma usarla dopo che ti sei connesso se vuoi farla sparire dopo la connessione, per cui a occhio la dispose la devi chiamare su this nel listener della connessione (bottone di connessione)
funzia uguale (tolto i menù almeno si capisce)
Code:import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Bella {
private JFrame jFrame = null; // @jve:decl-index=0:visual-constraint="10,10"
private JPanel jContentPane = null;
private JDesktopPane jDesktopPane = null;
private JButton jButton = null;
private JFrame jFrame1 = null; // @jve:decl-index=0:visual-constraint="418,16"
private JPanel jContentPane1 = null;
private JDesktopPane jDesktopPane1 = null;
private JButton jButton1 = null;
/**
* This method initializes jFrame
*
* @return javax.swing.JFrame
*/
private JFrame getJFrame() {
if (jFrame == null) {
jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(282, 191);
jFrame.setContentPane(getJContentPane());
jFrame.setTitle("Frame2");
}
return jFrame;
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getJDesktopPane(), BorderLayout.CENTER);
}
return jContentPane;
}
/**
* This method initializes jDesktopPane
*
* @return javax.swing.JDesktopPane
*/
private JDesktopPane getJDesktopPane() {
if (jDesktopPane == null) {
jDesktopPane = new JDesktopPane();
jDesktopPane.add(getJButton(), null);
}
return jDesktopPane;
}
/**
* This method initializes jButton
*
* @return javax.swing.JButton
*/
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setBounds(new Rectangle(56, 27, 173, 96));
jButton.setText("BUSONE");
}
return jButton;
}
/**
* This method initializes jFrame1
*
* @return javax.swing.JFrame
*/
private JFrame getJFrame1() {
if (jFrame1 == null) {
jFrame1 = new JFrame();
jFrame1.setSize(new Dimension(280, 189));
jFrame1.setTitle("Frame1");
jFrame1.setContentPane(getJContentPane1());
}
return jFrame1;
}
/**
* This method initializes jContentPane1
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane1() {
if (jContentPane1 == null) {
jContentPane1 = new JPanel();
jContentPane1.setLayout(new BorderLayout());
jContentPane1.add(getJDesktopPane1(), BorderLayout.CENTER);
}
return jContentPane1;
}
/**
* This method initializes jDesktopPane1
*
* @return javax.swing.JDesktopPane
*/
private JDesktopPane getJDesktopPane1() {
if (jDesktopPane1 == null) {
jDesktopPane1 = new JDesktopPane();
jDesktopPane1.add(getJButton1(), null);
}
return jDesktopPane1;
}
/**
* This method initializes jButton1
*
* @return javax.swing.JButton
*/
private JButton getJButton1() {
if (jButton1 == null) {
jButton1 = new JButton();
jButton1.setBounds(new Rectangle(52, 18, 174, 113));
jButton1.setText("AXET");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
getJFrame().setVisible(true);
getJFrame1().dispose();
}
});
}
return jButton1;
}
/**
* Launches this application
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Bella application = new Bella();
application.getJFrame1().setVisible(true);
}
});
}
}
Esattamente quello che ho appena fatto e funziona, la nuova finestra poi la apro nella gestione della chiusura.
Quello che mi lascia perplesso però è che sono sicuro al 1000000% di aver già provato a mettere la dispose nell'actionperformed ma mi ha sempre dato errore. Ora cercando di implementare l'idea che mi è venuta ieri ho riprovato anche a fare sta cosa e me l'ha presa.. nc.
Vabbè che non c'è da stupirsi, io ho impostato il tutto affinchè la finestra che volevo tanto chiudere appaia nel centro dello schermo. Una volta su tre appare nel centro, le altre due nell'angolo in alto a sinistra.
Che figata swing! :|
Cmq risolto il problema :nod:
edit@hador:
si ma quella roba lì fa System.exit eh hador :rain:
Inoltre è il frutto di un editor, anche io voglio un editor >_< (non è vero ho netbeans ma non lo uso :D)
riedit:
no però c'è un dispose infilato dentro da qualche parte.. ma siam sicuri che dispose funziona se non si imposta come defaultCloseOperation(DISPOSE_ON_CLOSE) ? :look:
se avessi aperto l'applicazione avresti visto che non lo avevo linkato sulla X ma sul bottone AXET :nod:
l'editor lo hai e non usarlo è farsi del male da soli, tra l'altro io lo uso su linux rsa mi par strano non vada su mac, abbiamo roba da 2k dollari aggratis e non la vuoi usare perchè non ti piace :|
certo, con quel comando dici solo al frame di chiamare la dispose in risposta all'evento close, che in un jframe viene triggerato dal bottone chiudi della finestra e dal segnale di chiusura del sistema operativo (alt-f4), in quel modo ad esempio puoi ridefinire la dispose evitando di reimplementare anche il listener
EDIT: forse ho capito male. Di sicuro, se tu non setti defaultCloseOperation(DISPOSE_ON_CLOSE) la dispose non viene chiamata automaticamente, se non ricordo male di default c'è EXIT_ON_CLOSE che equivale a System.Exit(non_so_che_int_ma_penso_1). Per cui se vuoi che la dispose sia chiamata in risposta all'evento del bottone devi mettere la riga defaultCloseOperation(DISPOSE_ON_CLOSE). Se invece la dispose la chiami tu, allora distrugge la finestra eseguendo il distruttore di default, che a sua volta esegue il distruttore su tutti gli oggetti del jframe e poi su sè stesso.
Non hai capito, nel codice postato da hador viene infilata una dispose nel codice nonostante il metodo di chiusura sia EXIT_ON_CLOSE. Questo non dovrebbe quindi portare al non far succedere un tubo? Ho fatto delle prove e così facendo la dispose è inutile mi sa.. discorso diverso se si usa DISPOSE_ON_CLOSE, usando la dispose viene "triggerato" l'evento di chiusura della finestra gestito poi dal windowadapter (o windowlistener, pressochè la stessa cosa).
il mio metodo funziona, c'è il main lancialo e vedi tu stesso :|
no bhe la dispose e il visibility ce li ho apppiccicati io, è il resto che ho fatto con l'editor grafico :sneer:
infatti potrebbero non essere concettualmente esatti, ma faccio fatica a capire perchè la mia soluzione, che mi pare la più demenziale, non dovrebbe andar bene.
non conosco affatto swing ho messo la dispose perchè lo ha detto marlbo, io avevo messo il setvisibility come avevi scritto tu all'inizio :sneer:
Significa che sei tu a chiudere la finestra, ma se usi il tasto di chiusura o ALT-F4 (credo) allora non chiama la dispose bensì la System.Exit.
@Hador, è ovviamente corretta per il bottone AXET, se vuoi che la dispose sia chiamata su tutti gli eventi di chiusura, come ho scritto sopra, devi anche settare DISPOSE_ON_CLOSE piuttosto che exit
capito la differenza, io cmq ho messo il bottone perchè avevo capito dovessi confermare user e name, se fai la x sulla finestra di login non so che succeda :nod:
Se non vi piace Swing, provate JavaFX.
JavaFX è quello su cui si basa l'editor grafico di netbeans, no?
Boh l'ho provato un po' l'altro giorno, comodo per creare le finestre ma alla fine mi risultava quasi più incasinato perchè cmq le mani dentro ce le devi ovviamente mettere tu e non avendo scritto il codice in prima battuta mi trovo quasi più spaesato.
Certo una volta che ci prendi la mano dev'essere N volte più comodo, ma non ho voglia di sbatterci la testa ora :D