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
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: