SimpleFileChooser

weljo

Bekanntes Mitglied
hi leute hab mir einen Einfachen FileChooser geschrieben da ich es nicht wirklich geschafft hab den normalen remotefähig zu machen. Hab jedoch noch ein problem mit threats ...

die methode showFC() sollte den die gewählte option des fc zurückgeben. das heisst die methode muss warten bis der user eine eingabe macht. hab mir das so gedacht ....

1. neuer thread starten der einen Frame startet und auf die eingabe wartet. bei einer eingabe setzt dieser die variable state im sfc
2. in eine while schleife setzen und warten bis der status gesetzt wurde

wenn ich in dei while nun Thread.sleep() schreibe friert mir irgendwie alles ein, jedoch will ich hier nur so lange festsitzen, bis mein soeben erzeugter thread mir state setzt. habs auch bereits mit Thread.currentThread.sleep versucht.

[JAVA=42]
package admin;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Vector;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.WindowConstants;
import javax.swing.filechooser.FileFilter;

public class SimpleFileChooser implements ActionListener, Runnable
{
private JPanel jPanel1;
private JList jList1;
private JButton jButton1;
private JButton jButton2;
private JPanel jPanel2;
private File[] list;
private FileFilter filter = new AcceptAllFileFilter();
private Vector<File> files = new Vector<File>();
private JFrame frame;

public static final int CHOSEN = 1, CANCELED =2;
public int state = 0;

public SimpleFileChooser(File dir)
{
if(dir.isDirectory())list = dir.listFiles();
else list = dir.getParentFile().listFiles();
}

public void setFileFilter(FileFilter filter)
{
this.filter=filter;
}

private Vector<File> filter() {
for(File f : list)
{
if(filter.accept(f))files.add(f);
}
return files;
}

public int showFC(Component c)
{
new Thread(this).start();
c.setEnabled(false);
while(state == 0)
{
//???
}
c.setEnabled(true);
return state;
}

@Override
public void run()
{
initGUI();
}

public File getSelectedFile()
{
return files.elementAt(jList1.getSelectedIndex());
}

private void initGUI()
{
frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
{
jPanel1 = new JPanel();
BorderLayout jPanel1Layout = new BorderLayout();
jPanel1.setLayout(jPanel1Layout);
frame.getContentPane().add(jPanel1, BorderLayout.CENTER);
{
ListModel jList1Model = new DefaultComboBoxModel(filter());
jList1 = new JList();
jPanel1.add(jList1, BorderLayout.CENTER);
jList1.setModel(jList1Model);
jList1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jList1.setPreferredSize(new java.awt.Dimension(335, 143));
}
{
jPanel2 = new JPanel();
jPanel1.add(jPanel2, BorderLayout.SOUTH);
{
jButton1 = new JButton();
jPanel2.add(jButton1);
jButton1.setText("Choose");
jButton1.addActionListener(this);
jButton1.setActionCommand("choose");
}
{
jButton2 = new JButton();
jPanel2.add(jButton2);
jButton2.setText("Cancel");
jButton2.addActionListener(this);
jButton2.setActionCommand("cancel");
}
}
}
frame.setSize(200, 201);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e)
{
String command = e.getActionCommand();
if(command.compareTo("choose")==0)
{
state = CHOSEN;
frame.dispose();
}
else if(command.compareTo("cancel")==0)
{
cancel();
frame.dispose();
}
}

private void cancel()
{
state = CANCELED;
}
}



[/code]

habs auch mal in 2 klassen geteilt da mir das mit new Thread(this) komisch vorkam aber hat das selbe bewirkt
 
Zuletzt bearbeitet:
S

SlaterB

Gast
hängt alles davon ab, wer showFC() aufruft, wie meinst du das mit remote?

pro laufendem Java-Programm gibt es genau einen AWT-Thread, der sich ums Zeichnen + Events kümmert,
wenn es gerade dieser ist, der showFC() aufruft, dann kann er sich eben nicht um ordentliches GUI-Handling kümmern, solange showFC() läuft,
neue Fenster von setVisible(true) werden vielleicht noch initial angezeigt, egal von welchem Thread aus aufgerufen, aber mindestens die Event-Behandlung liegt darnieder
 

weljo

Bekanntes Mitglied
mir remote mein ich, dass ich mir den ordnerinhalt eines anderen rechners(server) anseh ... dann würde anstatt dir.list() halt eine andere funktion stehn die mir den inhalt übergibt. habs jetzt nur mit dir.list() geschrieben damit man es auch ohne remote testen könnte... also vom remote nicht verwirren lassen, das ist nicht das probelm.

ok wenn es so ist dass nur einen thread für AWT gibt, wie kann ich dann mein problem lösen? bzw weis jemand wie das problem im JFileChooser gelöst ist ???
 
S

SlaterB

Gast
ach ja, jetzt fällt es mir wieder ein, ein modaler (J)Dialog hat irgendeine Magie, dass er den Aufrufer, auch den AWT-Thread, solange unterbricht bis er eine Rückgabe liefert, aber nicht so wie Thread.sleep(),
damit gehts, damit wird das Zeichnen usw. ermöglicht,

wollte auch schon immer wissen ob da normaler Code dahintersteckt (soweit man sowas wie Thread.sleep() auch überhaupt nachvollziehen kann) oder irgendwas systeminternes, vielleicht kann es jemand anders erklären

edit:
vielleicht kannst du einen normalen JFileChooser nutzen, und nur mit
setFileSystemView()
eine Komponente setzen, die sich um die Details zur Anbindung an die Festplatte kümmert,
Details kenne ich dazu aber nicht

edit:
http://www.java-forum.org/awt-swing-swt/82187-filechooser-nur-netzwerkpfade-anzeigen-lassen.html
 
Zuletzt bearbeitet von einem Moderator:

Oben