|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jul 2009
Messaggi: 4
|
[Java] JFIleChooser personalizzato
Ciao a tutti,
è una mattinata che ci sbatto la testa. A me servirebbe un JFileChooser che mi mostri sia i file che le cartelle, però vorrei che l'utente potesse interagire/selezionare solo le cartelle. In pratica il mio JFileChooser dovrebbe funzionare come se setFileSelectionMode fosse settato a JFileChooser.DIRECTORIES_ONLY, ma dovrebbe mostrarmi anche i nomi dei file (magari in grigino) ma non dovrebbe farmi interagire con quest'ultimi. Spero sia stato chiaro nell'esporre il mio problema. Qualcuno ha idea di come si possa fare? Grazie.
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2004
Città: Bolzano
Messaggi: 2163
|
Ciao, io dovrei fare la stessa cosa, tu ci sei riuscito?
__________________
Vendo...nulla. Cerco...la felicità. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Alzate la mano destra e dite: "giuro che non è per un compito universitario".
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
E sarei francamente interessato, dato che, preso dalla curiosità, stamani ho passato un'ora buona a scartabellare pazientemente la documentazione e goffamente i sorgenti di javax.swing.filechooser per concludere che il responsabile è l'UI del look'n'feel e non ho capito se e' possibile un workaround (dato che il built-in filter non e' personalizzabile tramite interfaccia pubblica delle API, a parte per il discorso relativo alla visualizzazione dei file nascosti). Non c'ho capito 'na mazza, vero?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Personalizzare l'UI è un problema perchè bisogna farlo in modo che si adatti agli altri delegati UI, nel senso estetico del problema.
Il truccone sta nel supporre che il delegato UI usi una JList per mostrare i file. A quel punto non fai altro che "paciugare" col suo renderer. Codice:
package test;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.Arrays;
import java.util.LinkedList;
import javax.swing.JFileChooser;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
public class Main {
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
start();
}
});
}
private static void start() {
final JFileChooser fc = new JFileChooser() {
@Override
public void approveSelection() {
File selectedFile = getSelectedFile();
if(selectedFile.isDirectory()) {
super.approveSelection();
}
}
};
fc.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getPropertyName().equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)) {
File file = (File) evt.getNewValue();
if(file.isFile()) {
fc.setSelectedFile(new File(""));
}
}
}
});
LinkedList<Component> stack = new LinkedList<Component>();
stack.add(fc);
JList list = null;
while(!stack.isEmpty()) {
Component c = stack.pop();
if(c instanceof Container) {
stack.addAll(Arrays.asList(((Container)c).getComponents()));
}
if(c instanceof JList) {
list = (JList) c;
break;
}
}
if(list != null) {
final ListCellRenderer cellRenderer = list.getCellRenderer();
ListCellRenderer fwdRenderer = new ListCellRenderer() {
private Color defaultColor;
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
isSelected = isSelected && value instanceof File && ((File)value).isDirectory();
cellHasFocus = cellHasFocus && value instanceof File && ((File)value).isDirectory();
Component component = cellRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if(value instanceof File) {
File file = (File) value;
if(defaultColor == null) {
defaultColor = component.getForeground();
}
component.setForeground(file.isDirectory() ? defaultColor : Color.LIGHT_GRAY);
}
return component;
}
};
list.setCellRenderer(fwdRenderer);
}
fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
fc.showOpenDialog(null);
}
}
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ma porc... avevo completamente mancato il metodo approveSelection().
Tra le ipotesi che avevo fatto una era appunto quella di settare selection mode a directory e files per e poi controllare l'approvazione o meno della selezione alla pressione del tasto di conferma. Potevo arrivarci. Dove invece non avrei saputo mettere mano è appunto sul delegato UI per ottenere un rendering personalizzato. Quote:
Da che cilindro hai tirato fuori il coniglio stavolta? Spulciamento dei sorgenti dell'openJDK? Comunque grazie
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Devo aver letto da qualche parte che quel display è una JList, solo che non ricordo più dove.
Comunque a naso sa di lista.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Cosa potrebbe usare per questa visualizzazione, una JTable? @EDIT: è sicuramente una JTable, nella visualizzazione "Dettagli" ci sono gli header sulle colonne; poi stampando il nome dei componenti tra tutto il marasma è saltata fuori una "class javax.swing.table.JTableHeader". Smanettando un pochino si può personalizzare il renderer anche per questa e il gioco e' fatto. PGI, grazie per le spiegazioni, mi piacerebbe sapere però certe informazioni dove le peschi: non farai mica la posta a tutti i blog degli ingegneri della ex-Sun che lavoravano alle API del JDK, vero?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 09-04-2010 alle 23:24. |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Credo di non aver mai premuto quel pulsante in 15 anni
E' una tabellaal 100%. Bisogna "agganciare" pure quella.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#10 | |
|
Junior Member
Iscritto dal: Jul 2009
Messaggi: 4
|
Grandi!!!
Non avevo ancora risolto del tutto il problema, che giuro non è per un compito universitario Un unico dubbio, Quote:
Non c'è un modo, invece, per inibire il click su quegli elementi della JList che non sono cartelle!? Ho provato ad andare un po' nei sorgenti di JFileChooser, in particolare a vedere la classe Handler in BasicFileChooserUI, ma non essendo ferratismo sulla parte swing di java, non sono riuscito a ricavarne nulla. E' solo una curiosità per capirne di più, così com'è ora funziona benissimo. Grazie mille. Ciao |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
L'ostacolo principale è che non si tratta di un click. La selezione catturata dal filechooser è un cosidetto evento semantico che sarebbe poi un insieme di eventi di basso livello (mouse, tastiera, focus eccetera) trasformati in qualche modo (es. pressione seguita da un rilascio entro tot millisecondi).
E' probabile che la selezione sia agganciata al ListSelectionListener della JList usata per mostrare i nomi dei file o cartelle e se così fosse si potrebbe pensare di modificare la lista in modo da aggiungere un filtro agli eventi di selezione. Si tratterebbe però di un intervento un po' aleatorio: i se cominciano ad essere parecchi.
__________________
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: 07:45.




















