|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
JAVA: problema con JFileChooser
Avrei la necessità di impedire la chiusura di un JFileChooser dal pulsantino "x"posto nell'angolo superiore destro della dialog...
O almeno di intercettare l'evento di chiusura in modo da ridefinirlo... Qualcuno ha un'idea di come si potrebbe fare? Ultima modifica di cn73 : 18-03-2004 alle 15:24. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
creare una classe estendendo quella dell'JFileChooser ridefinendo così il metodo che chiude la finestra?
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Si certo, ma il fatto è che non trovo i riferimenti a questo metodo! Il mmetodo con cui su apre quella che presumo sia una JDialog è
showDialog(Component parent, String approveButtonText) della classe jFileChooser... |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
dovresti andare a vedere nel file scr zippato che si trova nella j2sdk il file java che si riferisce alla classe jfilechooser e vedere dove sta quello che ti interessa .........da qualche parte sicuro si troverà, magari scopri che quelli della sun hanno esteso la classe JFrame per creare quella dell'jfilechooser quindi in pratica forse il metodo che gestische la chiusura è quello della classe JFrame.
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
La finestrella è creata "on the fly", per rimaneggiarla devi creare una sottoclasse e appoggiarti ai metodi che, gentilmente, il team Swing ci ha passato. Fortunatamente è una cosa nemmeno troppo invasiva:
Codice:
import java.awt.*;
import javax.swing.*;
public class Applicazione {
public static void main(String[] a) {
new Applicazione();
}
public Applicazione() {
JFileChooser chooser = new MyChooser();
chooser.showOpenDialog(null);
}
class MyChooser extends JFileChooser {
protected JDialog createDialog(Component parent) {
JDialog d = super.createDialog(parent);
d.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
return d;
}
}
}
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Nella mia versione di Swing non esiste il metodo createDialog
|
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
In effetti è un 1.4 o sup.
Mi raccomando, che non ti capiti mai di avere a disposizione un runtime aggiornato! recupero una documentazione 1.3 e ti so dire. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Recuperala pure 1.2
|
|
|
|
|
|
#9 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Beh, è già un passo avanti rispetto alla 1.1.8!
Non ho trovato "trucchi" nella documentazione precedente. Ci sono mille modi per farlo lo stesso, ma il problema che ci vedo io è farlo in un modo che sia meno invasivo possibile per il codice che hai già. La sottoclasse di prima ti consentiva semplicemente di sostituire una riga di codice e aggiungere la nuova "sottoclasse", perchè il metodo "createDialog" è quello usato dalla 1.4 in su per creare tutte le JDialog di JFileChooser.showDialog. Direi che devi trovare la soluzione che ti sembra più comoda: fai una sottoclasse di JFileChooser e ridefinisci il metodo showOpenDialog costruendo una tua JDialog oppure inserisci nel codice della tua applicazione un metodo "alternativo" per rendere visibile il JFileChooser (che è pur sempre un JComponent). Per questa seconda opzione, si può ricordare il metodo "addActionListener()" di JFileChooser, che viene "connesso" a tutti i componenti "azionabili" presenti nel filechooser. Ad esempio: Codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Applicazione implements ActionListener {
public static void main(String[] a) {
new Applicazione();
}
JFileChooser fileChooser = new JFileChooser();
JDialog chooserDialog = new JDialog();
String dialogAnswer = null;
public Applicazione() {
fileChooser.addActionListener(this);
String answer = showOpenDialog(fileChooser);
if(answer == JFileChooser.APPROVE_SELECTION) {
System.out.println(fileChooser.getSelectedFile());
}
System.exit(0);
}
public String showOpenDialog(JFileChooser chooser) {
chooser.setDialogType(JFileChooser.OPEN_DIALOG);
String title = chooser.getDialogTitle();
if(title == null) {
title = "Apri";
}
chooserDialog.setTitle(title);
chooserDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
chooserDialog.setModal(true);
chooserDialog.setContentPane(fileChooser);
chooserDialog.pack();
chooserDialog.setVisible(true);
return dialogAnswer;
}
public void actionPerformed(ActionEvent e) {
dialogAnswer = e.getActionCommand();
chooserDialog.setVisible(false);
}
}
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
mmm non so...troppo dispendioso e complicato, senza contare che il mio FileChooser è molto complesso, ha una sua FileSystemView, un suo FileChooserUI, un accessorio per la ricerca...
|
|
|
|
|
|
#11 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Devi considerare che il metodo showOpenDialog di default altro non fa che costruire una finestra di dialogo intorno al componente JFileDialog. A te interessa solo "catturare" quelle modifiche che ineriscono la finestra di dialogo, cioè il titolo e l'eventuale comportamento quando la finestra viene chiusa senza aver scelto alcunchè. In teoria se al metodo qui sopra passi la tua versione di JFileChooser non dovresti notare alcun cambiamento. Poi, naturalmente, vedi tu come gestire la faccenda.
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Scusami ma la Dialog devo costruirla da 0!
|
|
|
|
|
|
#13 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
C'è qualcosa che mi sfugge in quest'ultima affermazione...
JFileChooser fileChooser = new JFileChooser(); JDialog dialog = new JDialog(); dialog.getContentPane().add(fileChooser); dialog.pack(); dialog.show(). questa è la stessa GUI di fileChooser.showOpenDialog(...), salvo il titolo, ma solo quello. Una JDialog è un quadrato con un titolo e un bottone, non è che ci sia molto da costruire. IL contenuto ce l'hai già (JFileChooser è un JComponent), è come giocare con i lego |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Non avevo colto la tua affermazione...Grazie PGI metto in pratica e torno
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Ok funziona... ho fatto implementare ActionListener alla mia classe che estende JFileChooser e poi ho ridefinitoil metodo:
Codice:
public int showDialog(Component parent, String approveButtonText) {
setDialogType(JFileChooser.OPEN_DIALOG);
String title = getDialogTitle();
setApproveButtonText(approveButtonText);
chooserDialog= new JDialog((JFrame)parent);
addActionListener(this);
chooserDialog.setTitle(title);
chooserDialog.setDefaultCloseOperationJDialog.DO_NOTHING_ON_CLOSE);
chooserDialog.setModal(true);
chooserDialog.setContentPane(this);
chooserDialog.pack();
Point parentPos = parent.getLocation();
Dimension parentSize = parent.getSize();
Dimension dialogSize = chooserDialog.getSize();
if (dialogSize.height > parentSize.height) {
dialogSize.height = parentSize.height;
}
if (dialogSize.width > parentSize.width) {
dialogSize.width = parentSize.width;
}
chooserDialog.setLocation( parentPos.x + ((parentSize.width - dialogSize.width) / 2),
parentPos.y + ((parentSize.height - dialogSize.height) / 2));
chooserDialog.setVisible(true);
return dialogAnswer;
}
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
if (e.getActionCommand().equals(APPROVE_SELECTION ))
dialogAnswer = APPROVE_OPTION;
else
dialogAnswer = CANCEL_OPTION;
chooserDialog.setVisible(false);
}
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Ho migliorato molto con un bel
setOpaque(true); nel costruttore del FIleChooser restano delle piccole striscette blu cerco di ovviare con il settaggio del bckground... risolto con un bel chooserDialog.getContentPane().setBackground(getComponent(0).getBackground()); Mitico PGI ora la Dialog non è closeable ed è identica alle altre La versione definitiva: Codice:
public int showDialog(Component parent, String approveButtonText) {
setApproveButtonText(approveButtonText);
chooserDialog= new JDialog();
chooserDialog.setTitle(getDialogTitle());
chooserDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
chooserDialog.setModal(true);
chooserDialog.setContentPane(this);
chooserDialog.pack();
chooserDialog.setLocationRelativeTo(parent);
chooserDialog.getContentPane().setBackground(getComponent(0).getBackground());
chooserDialog.setVisible(true);
return dialogAnswer;
}
Ultima modifica di cn73 : 19-03-2004 alle 16:41. |
|
|
|
|
|
#17 | |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Quote:
alla prossima. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:20.



















