PDA

View Full Version : Aprire/chiudere finestre con Swing



Axet
11th July 2009, 13:57
Sto implementando la bozza della GUI per il programma di contabilità di cui avevamo parlato in life, ma mi sono accorto che.. non ho MAI usato Swing in maniera approfondita.

Finchè c'è da gestire bottoni, pannelli, azioni ed eventi vari non ci sono problemi però mo non riesco a capire come fare per chiudere una finestra ed aprirne un'altra.

Per capirci, ho una finestra iniziale di connessione al DB dove si inseriscono user e pass e premendo il bottoncino ti agganci al server. E fin qui non c'è il minimo problema, funziona tutto alla perfezione.
Ora però vorrei che la finestra si chiudesse in automatico (quella di connessione) per far apparire un altro JFrame con il "menu generale".

Il problema è che sti cazzo di JFrame sono in una sorta di loop perenne quindi le operazioni non sono sequenziali ma event-driven, non si può gestire il tutto dall'esterno sfruttando eventuali variabili di controllo per lo stesso motivo, però se all'interno di qualche ActionEvent cerco di usare il metodo dispose() non me lo prende (anche se imposto DISPOSE_ON_CLOSE come metodo di chiusura).

So che è un problema stupido di per se, ma per quel che ho sempre dovuto fare non ho mai avuto necessità di usare le GUI in java :D

Cioè l'unica idea che mi è venuta dopo averci pensato per un'oretta buona e non riuscendo a cavare un ragno dal buco sarebbe di usare i thread e far si che le finestre si sincronizzino tra loro in questa maniera (in questo modo anche se l'esecuzione all'interno del dato frame segue un ordine strano non me ne frega un cazzo perchè tanto verrebbe gestito tutto dal controllore), però pd mi pare assurdo che non esista un metodo più semplice :rain:

Illuminatemi :love:

Hador
11th July 2009, 14:00
se hai rational ultima versione del dipartimento ha l'editor integrato e un po' di esempi... anche io usato un cazzo quindi nn so ma in quello che ti crea l'editor ti preimposta la finestra about che si apre col bottone quindi basta copiare

Axet
11th July 2009, 14:03
La finestra about riesco a farla visualizzare da codice, non ci vuole un cazzo.
Ma non è quello che mi serve.. io ho bisogno di chiudere un certo JFrame (o far si che venga anche impostato come setVisible(false)) e aprirne un altro.

Btw su eclipse ho installato anche Visual Editor ma fa pena pietà e compassione (ho capito perchè il progetto è stato abbandonato nel 2006 lol).

Ho provato con netbeans ma anche lì, il tool è comodo per disegnare una finestra, ma per chiuderne una e aprirne un'altra.. zero :|

Hador
11th July 2009, 14:12
nn ho tempo di guardarci, dai un occhio qua http://www.java2s.com/Tutorial/Java/0240__Swing/1300__JFrame-Window.htm
cmq è per questo che ti dicevano di usare c# :sneer:

Axet
11th July 2009, 14:16
nn ho tempo di guardarci, dai un occhio qua http://www.java2s.com/Tutorial/Java/0240__Swing/1300__JFrame-Window.htm
cmq è per questo che ti dicevano di usare c# :sneer:

Questione di principio, anche perchè ci sono buone probabilità che cmq sto "allenamento" mi serva per lo stage.

Btw avevo già visto quel tutorial, nulla di nuovo..

Hador
11th July 2009, 14:27
http://java.sun.com/docs/books/tutorial/uiswing/components/toplevel.html ? :nod:

Axet
11th July 2009, 15:01
Na :|

Evildark
11th July 2009, 15:12
ecco... quando tanek, che è un ingegnere "medio" (nel senso positivo del termine :love:) e a cui hanno fatto un culo quadro durante il corso di laurea su come si stima le ore/uomo necessarie per un progetto, diceva che è importante la pianificazione, la stima e la progettazione prima della realizzazione... non aveva del tutto torto :sneer:

uno dei principali assiomi è che "anche quando il lavoro sembra isi e veloce ti appariranno sempre e in grande quantità problemi che non avevi previsto, quindi meglio sempre sovradimensionare" :rotfl:

Hador
11th July 2009, 15:24
secondo me non devi farlo con jFrame, jframe non è la finestra intera? tu vuoi cambiare l'interno della finestra giusto? Allora aggiungi un jdesktoppane e crea internalframe dentro di quello invece che cercare di cambiare la jframe. (non ne so un cazzo eh, ma è quel che ho capito dalla descrizione della struttura)
ecco... quando tanek, che è un ingegnere "medio" (nel senso positivo del termine :love:) e a cui hanno fatto un culo quadro durante il corso di laurea su come si stima le ore/uomo necessarie per un progetto, diceva che è importante la pianificazione, la stima e la progettazione prima della realizzazione... non aveva del tutto torto :sneer:
uno dei principali assiomi è che "anche quando il lavoro sembra isi e veloce ti appariranno sempre e in grande quantità problemi che non avevi previsto, quindi meglio sempre sovradimensionare" :rotfl:si chiama studio di fattibilità :nod:

Evildark
11th July 2009, 15:41
lo so so anche io ingegnere:nod: stavo semicitando tanek (:love:) :nod:

Axet
11th July 2009, 15:44
ecco... quando tanek, che è un ingegnere "medio" (nel senso positivo del termine :love:) e a cui hanno fatto un culo quadro durante il corso di laurea su come si stima le ore/uomo necessarie per un progetto, diceva che è importante la pianificazione, la stima e la progettazione prima della realizzazione... non aveva del tutto torto :sneer:

uno dei principali assiomi è che "anche quando il lavoro sembra isi e veloce ti appariranno sempre e in grande quantità problemi che non avevi previsto, quindi meglio sempre sovradimensionare" :rotfl:

Cazzo c'entra, sapevo che avrei avuto di sti problemi, li ho considerati nel tempo che ci avrei impiegato :D

@hador:
jframe = finestra.. una finestra generica

Hador
11th July 2009, 15:45
non centra essere ingegnere, centra essere un architetto software :nod:
si axet ma jframe è la classe contenitore di alto livello, la finestra con i menu e la X, dentro questa tu puoi fare un desktop pane e dentro il desktop pane avere jinternalframe o come minchia si chiamano, e poi switchi gli internal.

Axet
11th July 2009, 15:51
I menu li ha se li aggiungi tu, come hai detto è un contenitore.

Btw io voglio una finestra nuova con anche le iconcine in alto per chiudere & co.

Hador
11th July 2009, 15:57
non hai capito, tu vuoi tipo schiaccio un pulsante e ho una nuova finestra invece che quella vecchia?
il jframe è il contenitore, poi puoi avere altri frame interni, il jframe pd è firefox e il jinternalframe è la finestra della tab, capito? se chiudi il tab il jframe mica viene chiuso.
Se vuoi cambiare il contenuto quindi non cambiare TUTTO ma cambia quella interna, sta roba la fai utilizzando i container e gli internalframe.

Axet
11th July 2009, 15:59
No non hai capito te lol, non me ne faccio un cazzo di rimodellare il contenuto ho bisogno che mi si apra una finestra nuova. Due finestre, due. Che poi magari la prima la chiudo o la rendo invisibile, ma ho bisogno che me ne apra una ex-novo

Mosaik
11th July 2009, 16:00
E' la giusta punizio per aver usato Java :confused:

Axet
11th July 2009, 16:08
Vabbè una volta risolta sta cosa non dovrei avere più ostacoli :p

Tanek
11th July 2009, 16:24
ecco... quando tanek, che è un ingegnere "medio" (nel senso positivo del termine :love:) e a cui hanno fatto un culo quadro durante il corso di laurea su come si stima le ore/uomo necessarie per un progetto, diceva che è importante la pianificazione, la stima e la progettazione prima della realizzazione... non aveva del tutto torto :sneer:
uno dei principali assiomi è che "anche quando il lavoro sembra isi e veloce ti appariranno sempre e in grande quantità problemi che non avevi previsto, quindi meglio sempre sovradimensionare" :rotfl:
Mi spieghi per favore qual è il senso positivo di "ingegnere medio"? :scratch:
Poi vedo se è il caso di insultarti o no :sneer:

Cmq Axet io non posso aiutarti mi dispiace, swing l'ho usato solo in univ e poi l'ho allegramente dimenticato, sviluppo solo per web app :)
(in effetti potevi dirgli che gli facevi una web app, così dovevi curargli il doppio della manutenzione, l'app e il web server :sneer: gli imponevi un po' di vincoli tipo IE only o FF only e poi li vedevi felici quando aprivano il loro browser tutto sbrilluccicoso con img e link per accedere ai loro dati :sneer: )

Hador
11th July 2009, 16:32
No non hai capito te lol, non me ne faccio un cazzo di rimodellare il contenuto ho bisogno che mi si apra una finestra nuova. Due finestre, due. Che poi magari la prima la chiudo o la rendo invisibile, ma ho bisogno che me ne apra una ex-novo
aaaah e dillo :sneer:
allora è isi, nn so come si fa ma lo ho visto fare :confused:

Axet
11th July 2009, 16:44
Il problema che una finestra è persistente, ogni classe che estende jframe è un loop continuo quindi non posso controllare da fuori t_T spe allego il codice della classe magari aiuta (tanto non ho fatto un cazzo inerentemente all'aprire una nuova finestra :O)



import java.awt.Toolkit;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.JLabel;




public class Connect_GUI extends JFrame{

/**
*
*/
private static final long serialVersionUID = 1L;
private Toolkit toolkit;

public Connect_GUI(){

setSize(400, 300);
setTitle("Autenticazione a Cedri.. ");
setDefaultCloseOperation(EXIT_ON_CLOSE);
toolkit = getToolkit();
Dimension size = toolkit.getScreenSize();
setLocation(size.width/2 - getWidth()/2, size.height/2 - getHeight()/2);

final JTextField user_text = new JTextField();
final JPasswordField pass_text = new JPasswordField();

final JPanel panel = new JPanel(new BorderLayout());
getContentPane().add(panel);

panel.setLayout(null);

JLabel user_label = new JLabel("User:");
user_label.setBounds(80, 60, 50, 30);

user_text.setBounds(150, 60, 150, 30);

JLabel pass_label = new JLabel("Pass:");
pass_label.setBounds(80, 100, 50, 30);

pass_text.setBounds(150, 100, 150, 30);

JButton connetti = new JButton("Connetti");
connetti.setToolTipText("Premere per connettersi al DB");
connetti.setBounds(150, 150, 150, 30);

connetti.addActionListener(new ActionListener() {
@SuppressWarnings("deprecation")
public void actionPerformed(ActionEvent event){
String user = null, pass = null;
user = user_text.getText();
pass = pass_text.getText();
boolean ctrl;
if(user != null && pass != null)
{
ctrl = Connect.connessione(user, "");
if(ctrl == true){
JOptionPane.showMessageDialog(panel, "Autenticazione effettuata");
}
else
JOptionPane.showMessageDialog(panel, "Errore durante l'autenticazione");
}


}
});

panel.add(connetti);
panel.add(user_label);
panel.add(user_text);
panel.add(pass_label);
panel.add(pass_text);

WindowDestroyer listener = new WindowDestroyer();
addWindowListener(listener);

}


}

Evildark
11th July 2009, 16:59
Mi spieghi per favore qual è il senso positivo di "ingegnere medio"? :scratch:
Poi vedo se è il caso di insultarti o no :sneer:

che come a tutti gli ingegneri "in media", durante il corso di laurea ci hanno tartassato sugli stessi argomenti, senza distinzioni tra elettronici, meccanici, informatici, gestion.. ops ho detto gestionali... :hidenod:

Axet
11th July 2009, 18:10
Minchia tra tutti gli informatici di sto forum possibile che nessuno conosca un po' di swing a livello "avanzato"? :rain:

Glasny
11th July 2009, 22:13
Ora non si capisce, il tuo problema è non riuscire a chiudere o non appaiono le nuove finestre ?

Provo a darti una mano ma è solo un tentativo.

Se non riesci a chiuderla prova dall'esterno del window listener (dovresti avere un thread del main non credo serva un thread apposta), puoi provare dispose oppure usi processWindowEvent. Chiudere una finestra dall'interno del listener può portare a un loop se si manda un evento di WINDOW_CLOSING.

Magari non serve a un cazzo quello che ho scritto ma c'ho provato :D

Ovvio se non hai nessun'altro thread attivo(incluso il main) e chiudi l'unico jframe aperto la jvm potrebbe anche terminare, cioè se fai dispose all'interno del jframe e poi vuoi creare un nuovo jframe dopo.. probabilmente a quel codice non ci si arriva mai.

Axet
12th July 2009, 02:08
Se uso il metodo dispose dall'interno della classe che estende jframe non succede un tubo (testato, ma magari ho sbagliato qualcosa io).

Btw io uso già un "windowdestroyer" e la finestra me la chiude se viene "triggerato" l'evento di chiusura della finestra (come il premere l'icona X in alto a destra o la pressione di un jbutton settato per la chiusura della finestra).. il problema è che per quello che devo fare io non posso fare una cosa del genere.

Btw durante questo stato di ebrezza post-sabato sera mi è venuta un'idea, domani provo ad implementarla sperando di non dimenticarmi :D

Glasny
12th July 2009, 02:29
Se uso il metodo dispose dall'interno della classe che estende jframe non succede un tubo (testato, ma magari ho sbagliato qualcosa io).

Btw io uso già un "windowdestroyer" e la finestra me la chiude se viene "triggerato" l'evento di chiusura della finestra (come il premere l'icona X in alto a destra o la pressione di un jbutton settato per la chiusura della finestra).. il problema è che per quello che devo fare io non posso fare una cosa del genere.

Btw durante questo stato di ebrezza post-sabato sera mi è venuta un'idea, domani provo ad implementarla sperando di non dimenticarmi :D

Per triggerare usa processWindowEvent o un metodo per mandare un evento, manda un evento di tipo WINDOW_CLOSING. Basta farlo fuori dal listener.

Alkabar
12th July 2009, 03:14
Saro' generico:

Per ogni evento piu' o meno esistente in Swing, c'e' l'interfaccia apposita. Implementi l'apposita interfaccia (es: ActionListener), e registri il listener dell'evento nel container dove l'evento e' prodotto (JFrame, JPanel etc).

Lo stesso container puo' implementare tali interfacce.... a te e' richiesto definire i metodi relativi a tali interfacce, che vengono poi chiamati durante la notifica dell'evento.

Alkabar
12th July 2009, 03:22
Minchia tra tutti gli informatici di sto forum possibile che nessuno conosca un po' di swing a livello "avanzato"? :rain:


Esempio:

public class ClosingFrame extends JFrame implements WindowListener{


Il listener di cui devi implementare l'interfaccia e' WindowListener.

ora devi registrare il listener...

lo fai cosi':

this.addWindowListener(this);

Si capisci bene questa classe che estende JFrame e' listener di se stesso.

al che:

public void windowClosed(WindowEvent e){
/// QUI CI CREI IL NUOVO FRAME
JFrame miinchia = new JFrame("PER LE PALLE DI DESCARTES !!!");

}


Dovrebbe essere la soluzione ai tuoi problemi.

marlborojack
12th July 2009, 10:29
JFrame miinchia = new JFrame("PER LE PALLE DI DESCARTES !!!");


spero che questo lo copi/incolli senza cambiare :nod:

Axet
12th July 2009, 11:09
Saro' generico:
Per ogni evento piu' o meno esistente in Swing, c'e' l'interfaccia apposita. Implementi l'apposita interfaccia (es: ActionListener), e registri il listener dell'evento nel container dove l'evento e' prodotto (JFrame, JPanel etc).
Lo stesso container puo' implementare tali interfacce.... a te e' richiesto definire i metodi relativi a tali interfacce, che vengono poi chiamati durante la notifica dell'evento.

Ma va? :D


Esempio:
public class ClosingFrame extends JFrame implements WindowListener{
Il listener di cui devi implementare l'interfaccia e' WindowListener.
ora devi registrare il listener...
lo fai cosi':
this.addWindowListener(this);
Si capisci bene questa classe che estende JFrame e' listener di se stesso.
al che:
public void windowClosed(WindowEvent e){
/// QUI CI CREI IL NUOVO FRAME
JFrame miinchia = new JFrame("PER LE PALLE DI DESCARTES !!!");
}
Dovrebbe essere la soluzione ai tuoi problemi.

Io voglio creare un nuovo jframe, diverso da quello che vado a chiudere, quindi non c'è necessità di dichiarare tutto nella stessa classe.
Come si vede anche dal codice che ho postato, la classe che estende windowadapter l'ho dichiarata a se.
Cmq come dicevo ieri sera mi è venuta un'idea, appena mi passa il mal di testa provo:D

Hador
12th July 2009, 11:26
io continuo a non capire cosa vuoi fare ma fa niente... scusa ma se hai jFrame1 e jFrame2 non capisco quale sia il problema di chiamare il setVisible del 2 sull'azione di chiusura dell'1...

fatto in 2 secondi con l'edito di rsa... non conosco swing quindi non se se set visible vada bene o c'è modo di killarlo del tutto (se setvisible non lo faccia da sè), dimmi tu. Copiaincolla e runnalo :nod:


import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Event;
import java.awt.BorderLayout;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.KeyStroke;
import java.awt.Point;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JFrame;
import javax.swing.JDialog;
import javax.swing.JDesktopPane;
import javax.swing.JButton;
import java.awt.Rectangle;
import java.awt.Dimension;

public class Bella {

private JFrame jFrame = null;
private JPanel jContentPane = null;
private JMenuBar jJMenuBar = null;
private JMenu fileMenu = null;
private JMenu editMenu = null;
private JMenu helpMenu = null;
private JMenuItem exitMenuItem = null;
private JMenuItem aboutMenuItem = null;
private JMenuItem cutMenuItem = null;
private JMenuItem copyMenuItem = null;
private JMenuItem pasteMenuItem = null;
private JMenuItem saveMenuItem = null;
private JDialog aboutDialog = null;
private JPanel aboutContentPane = null;
private JLabel aboutVersionLabel = 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_CLO SE);
jFrame.setJMenuBar(getJJMenuBar());
jFrame.setSize(300, 200);
jFrame.setContentPane(getJContentPane());
jFrame.setTitle("Application");
}
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 jJMenuBar
*
* @return javax.swing.JMenuBar
*/
private JMenuBar getJJMenuBar() {
if (jJMenuBar == null) {
jJMenuBar = new JMenuBar();
jJMenuBar.add(getFileMenu());
jJMenuBar.add(getEditMenu());
jJMenuBar.add(getHelpMenu());
}
return jJMenuBar;
}

/**
* This method initializes jMenu
*
* @return javax.swing.JMenu
*/
private JMenu getFileMenu() {
if (fileMenu == null) {
fileMenu = new JMenu();
fileMenu.setText("File");
fileMenu.add(getSaveMenuItem());
fileMenu.add(getExitMenuItem());
}
return fileMenu;
}

/**
* This method initializes jMenu
*
* @return javax.swing.JMenu
*/
private JMenu getEditMenu() {
if (editMenu == null) {
editMenu = new JMenu();
editMenu.setText("Edit");
editMenu.add(getCutMenuItem());
editMenu.add(getCopyMenuItem());
editMenu.add(getPasteMenuItem());
}
return editMenu;
}

/**
* This method initializes jMenu
*
* @return javax.swing.JMenu
*/
private JMenu getHelpMenu() {
if (helpMenu == null) {
helpMenu = new JMenu();
helpMenu.setText("Help");
helpMenu.add(getAboutMenuItem());
}
return helpMenu;
}

/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getExitMenuItem() {
if (exitMenuItem == null) {
exitMenuItem = new JMenuItem();
exitMenuItem.setText("Exit");
exitMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
return exitMenuItem;
}

/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getAboutMenuItem() {
if (aboutMenuItem == null) {
aboutMenuItem = new JMenuItem();
aboutMenuItem.setText("About");
aboutMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JDialog aboutDialog = getAboutDialog();
aboutDialog.pack();
Point loc = getJFrame().getLocation();
loc.translate(20, 20);
aboutDialog.setLocation(loc);
aboutDialog.setVisible(true);
}
});
}
return aboutMenuItem;
}

/**
* This method initializes aboutDialog
*
* @return javax.swing.JDialog
*/
private JDialog getAboutDialog() {
if (aboutDialog == null) {
aboutDialog = new JDialog(getJFrame(), true);
aboutDialog.setTitle("About");
aboutDialog.setContentPane(getAboutContentPane());
}
return aboutDialog;
}

/**
* This method initializes aboutContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getAboutContentPane() {
if (aboutContentPane == null) {
aboutContentPane = new JPanel();
aboutContentPane.setLayout(new BorderLayout());
aboutContentPane.add(getAboutVersionLabel(), BorderLayout.CENTER);
}
return aboutContentPane;
}

/**
* This method initializes aboutVersionLabel
*
* @return javax.swing.JLabel
*/
private JLabel getAboutVersionLabel() {
if (aboutVersionLabel == null) {
aboutVersionLabel = new JLabel();
aboutVersionLabel.setText("Version 1.0");
aboutVersionLabel.setHorizontalAlignment(SwingCons tants.CENTER);
}
return aboutVersionLabel;
}

/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getCutMenuItem() {
if (cutMenuItem == null) {
cutMenuItem = new JMenuItem();
cutMenuItem.setText("Cut");
cutMenuItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_X,
Event.CTRL_MASK, true));
}
return cutMenuItem;
}

/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getCopyMenuItem() {
if (copyMenuItem == null) {
copyMenuItem = new JMenuItem();
copyMenuItem.setText("Copy");
copyMenuItem.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_C,
Event.CTRL_MASK, true));
}
return copyMenuItem;
}

/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getPasteMenuItem() {
if (pasteMenuItem == null) {
pasteMenuItem = new JMenuItem();
pasteMenuItem.setText("Paste");
pasteMenuItem.setAccelerator(KeyStroke.getKeyStrok e(KeyEvent.VK_V,
Event.CTRL_MASK, true));
}
return pasteMenuItem;
}

/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getSaveMenuItem() {
if (saveMenuItem == null) {
saveMenuItem = new JMenuItem();
saveMenuItem.setText("Save");
saveMenuItem.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_S,
Event.CTRL_MASK, true));
}
return saveMenuItem;
}

/**
* 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.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) {
getJFrame1().setVisible(false);
getJFrame().setVisible(true);
}
});
}
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);
}
});
}

}

(devo studiare reverse... ne ho talmente voglia che piuttosto mi son mezzo a giocare con i problemi di axet :|)

marlborojack
12th July 2009, 11:41
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)

Hador
12th July 2009, 11:44
funzia uguale (tolto i menù almeno si capisce)


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_CLO SE);
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);
}
});
}

}

Axet
12th July 2009, 11:46
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)

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:

Hador
12th July 2009, 12:00
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 :|

marlborojack
12th July 2009, 12:07
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:

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.

Axet
12th July 2009, 12:41
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).

Hador
12th July 2009, 12:47
il mio metodo funziona, c'è il main lancialo e vedi tu stesso :|

Axet
12th July 2009, 13:05
il mio metodo funziona, c'è il main lancialo e vedi tu stesso :|

Ovvio è autogenerato :sneer:

Rileggendomi non son stato chiaro, in sintesi intendevo che non capisco il senso di quella dispose piazzata lì così senza che il metodo di chiusura sia impostato su DISPOSE_ON_CLOSE :nod:

Hador
12th July 2009, 13:08
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:

marlborojack
12th July 2009, 14:02
Ovvio è autogenerato :sneer:
Rileggendomi non son stato chiaro, in sintesi intendevo che non capisco il senso di quella dispose piazzata lì così senza che il metodo di chiusura sia impostato su DISPOSE_ON_CLOSE :nod:

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

Hador
12th July 2009, 14:25
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:

Alkabar
12th July 2009, 19:24
Se non vi piace Swing, provate JavaFX.

Axet
12th July 2009, 22:56
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

Alkabar
12th July 2009, 23:49
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

E' un linguaggio dichiarativo in termini di scripts per definire finestre un pelino piu' carine graficamente in Java.