|
|||||||
|
|
|
![]() |
|
|
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 14: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: 21:42.



















