|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Feb 2008
Città: Da qualche parte a sud... mooolto a sud
Messaggi: 79
|
[JAVA] Aiuto con finestra di dialogo OK/Annulla
Ehi
Perdonate il titolo criptico ma il problema è presto detto. Ho bisogno di mettere a punto una finestra di dialogo che mi permetta di scegliere se fare o non fare una determinata operazione. Ecco la situazione in cui mi trovo: Codice:
//Ci troviamo nell'action performed di un pulsante dialogo.setVisible(true); int retval= dialogo.getReturnStatus(); if(retval==dialogo.RET_OK){... Come fareste? Ciau e grazie in anticipo
__________________
<=>MB ASUS P5Q PRO <=> CPU INTEL Q9650 3GHZ @3900MHZ <=> COOLED BY ZALMAN 9700 CNPS LED<=> RAM 4*1GB KINGSTONE HYPER-X DDR2 @ 1100 MHZ 5-6-6-18 <=> HDD SEAGATE + WD 800GB <=>FUELED BY ZOTAC NVIDIA 460GTX AMP! EDITION<=>KEYBOARD LOGITECH G11<=> MOUSE COOLER MASTER SENTINEL<=>SOUND BY LOGITECH G35<=> MONITOR ACER AL1917 19'' 1280*1024<=>
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Una soluzione sincrona è questa:
Codice:
package test; import java.awt.Dialog; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; public final class MyOptionDialog extends JDialog { public static final int OK = 0; public static final int CANCEL = 1; private int choosenValue = CANCEL; public MyOptionDialog(JFrame parent) { super(parent, Dialog.ModalityType.APPLICATION_MODAL); setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); JButton ok = new JButton("Ok"); JButton cancel = new JButton("Cancel"); JPanel container = new JPanel(new FlowLayout()); container.add(ok); container.add(cancel); add(container); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { choosenValue = OK; dispose(); } }); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { choosenValue = CANCEL; dispose(); } }); } public int getChoosenValue() { return choosenValue; } } Codice:
dialog.setVisible(true); int value = dialog.getChoosenValue(); Naturalmente non è l'unica soluzione. Un'alternativa utile in contesti asincroni è: Codice:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package test; import java.awt.Dialog; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; /** * * @author pgi */ public final class MyOptionDialog extends JDialog { public static final int OK = 0; public static final int CANCEL = 1; private Runnable onAccept, onCancel; public MyOptionDialog(JFrame parent) { super(parent, Dialog.ModalityType.APPLICATION_MODAL); setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); JButton ok = new JButton("Ok"); JButton cancel = new JButton("Cancel"); JPanel container = new JPanel(new FlowLayout()); container.add(ok); container.add(cancel); add(container); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); onAccept.run(); } }); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); onCancel.run(); } }); } public void show(Runnable onAccept, Runnable onCancel) { this.onAccept = onAccept; this.onCancel = onCancel; pack(); setVisible(true); } } Codice:
MyOptionDialog dialog = new MyOptionDialog(f); dialog.show( new Runnable() { public void run() { System.out.println("OK"); }}, new Runnable() { public void run() { System.out.println("CANCEL"); }});
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Feb 2008
Città: Da qualche parte a sud... mooolto a sud
Messaggi: 79
|
Grazie mille per la risposta! Alla fine, data la complessità relativa del progetto, ho deciso di optare per un più semplice JOptionPane.
[OT]Volevo chiedere, come salvare un array di oggetti in un file utilizzando un ObjectOutputStream? Continuo ad avere errori di IO.... Qualche idea?[/OT]
__________________
<=>MB ASUS P5Q PRO <=> CPU INTEL Q9650 3GHZ @3900MHZ <=> COOLED BY ZALMAN 9700 CNPS LED<=> RAM 4*1GB KINGSTONE HYPER-X DDR2 @ 1100 MHZ 5-6-6-18 <=> HDD SEAGATE + WD 800GB <=>FUELED BY ZOTAC NVIDIA 460GTX AMP! EDITION<=>KEYBOARD LOGITECH G11<=> MOUSE COOLER MASTER SENTINEL<=>SOUND BY LOGITECH G35<=> MONITOR ACER AL1917 19'' 1280*1024<=>
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Quote:
|
|
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Feb 2008
Città: Da qualche parte a sud... mooolto a sud
Messaggi: 79
|
Il codice è inserito in un blocco try-catch: infatti l'errore IOException me lo dà in esecuzione attraverso le modalità che ho specificato nel 'catch'. Ecco il codice comunque:
Codice:
try{ ObjectOutputStream pack=new ObjectOutputStream(new FileOutputStream(file)); Object[] saveData = {(Object)players, (Object)state, (Object)game.currentplayer}; pack.writeObject((Object)saveData); pack.close(); result=true; }catch(IOException ioe){ dialogs.showMessageDialog(support, (Object)("Errore durante il salvataggio: IO Exception"), "Monopoly -- Errore", JOptionPane.ERROR_MESSAGE); } ![]()
__________________
<=>MB ASUS P5Q PRO <=> CPU INTEL Q9650 3GHZ @3900MHZ <=> COOLED BY ZALMAN 9700 CNPS LED<=> RAM 4*1GB KINGSTONE HYPER-X DDR2 @ 1100 MHZ 5-6-6-18 <=> HDD SEAGATE + WD 800GB <=>FUELED BY ZOTAC NVIDIA 460GTX AMP! EDITION<=>KEYBOARD LOGITECH G11<=> MOUSE COOLER MASTER SENTINEL<=>SOUND BY LOGITECH G35<=> MONITOR ACER AL1917 19'' 1280*1024<=>
Ultima modifica di Syrius_89 : 19-12-2009 alle 13:53. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Senza la traccia dell'eccezione è difficile dire cosa capiti. E' possibile che tu stia cercando di serailizzare qualcosa di non serializzabile?.
Una nota a margine, ricorda che devi sempre garantire la chiusura dei flussi che apri.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Feb 2008
Città: Da qualche parte a sud... mooolto a sud
Messaggi: 79
|
Facendo un pò di debug ho scoperto che l'eccezione è generata da writeObject.
Il flusso dovrei averlo chiuso col metodo close(). saveData è formato da una LinkedList (players) convertita a object, un array di boolean (vedi sopra) e infine un Integer (sempre castizzato a Object). Con... traccia dell'eccezione che intendi?
__________________
<=>MB ASUS P5Q PRO <=> CPU INTEL Q9650 3GHZ @3900MHZ <=> COOLED BY ZALMAN 9700 CNPS LED<=> RAM 4*1GB KINGSTONE HYPER-X DDR2 @ 1100 MHZ 5-6-6-18 <=> HDD SEAGATE + WD 800GB <=>FUELED BY ZOTAC NVIDIA 460GTX AMP! EDITION<=>KEYBOARD LOGITECH G11<=> MOUSE COOLER MASTER SENTINEL<=>SOUND BY LOGITECH G35<=> MONITOR ACER AL1917 19'' 1280*1024<=>
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Nel catch scrivi:
ex.printStackTrace(); Ricompila ed esegui. Sulla console ti apparirà la traccia dell'eccezione. Per la sua posizione nel codice, quel close non viene invocato se si verifica un'eccezione. La forma corretta è: Codice:
FileOutputStream fout = null; try { fout = new FileOutputStream(il file); ObjectOutputStream out = new ObjectOutputStream(fout); ...eccetera } catch(IOException ex) { ...eccetera } finally { if(fout != null) { try { fout.close(); } catch(IOException ex) { ex.printStackTrace(); } } }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:36.