Hallo zusammen,
ich habe ein JFrame mit einem Textfeld, in das der Beutzer einen Barcode einscannen kann. Mit diesem Barcode bzw. mit Daten, die in Verbindung zum Barcode stehen, werden dann in einer Klasse ImageDisplay zwei (immer zwei!) BufferedImage erzeugt. Nun laufen die Klasse ImageDisplay und die ScanGUI in einem Thread, da der Benutzer im Hintergrund erneut einscannen können sollte, was auch funktioniert. Nur wenn man einscannt während ein Bild angezeigt wird, wird zwar das passende Bild für den neuen Code generiert, aber eben nur eines und das wird dann nur sehr kurz anstatt normalerweise 5 Sek. angezeigt.
Ich weiss allerdings nicht woran das liegt geschweige denn wie ich das beheben kann.
Hier ist der Code der Klasse ImageDisplay, die von der Scan-GUI gestartet wird.
Ich unterbreche zwar den ImageDisplay-Thread jedesmal wenn neu eingescannt wird, aber irgendwie ist das der Klasse total egal und deswegen vermute ich werden nicht alle Bilder lang bzw. überhaupt angezeigt. Aber das ist nur ne Vermutung, bin nämlich um ehrlich zu sein total am Ende mit meinem Latein und wäre deswegen über Tipps mehr als nur erfreut.
ich habe ein JFrame mit einem Textfeld, in das der Beutzer einen Barcode einscannen kann. Mit diesem Barcode bzw. mit Daten, die in Verbindung zum Barcode stehen, werden dann in einer Klasse ImageDisplay zwei (immer zwei!) BufferedImage erzeugt. Nun laufen die Klasse ImageDisplay und die ScanGUI in einem Thread, da der Benutzer im Hintergrund erneut einscannen können sollte, was auch funktioniert. Nur wenn man einscannt während ein Bild angezeigt wird, wird zwar das passende Bild für den neuen Code generiert, aber eben nur eines und das wird dann nur sehr kurz anstatt normalerweise 5 Sek. angezeigt.
Ich weiss allerdings nicht woran das liegt geschweige denn wie ich das beheben kann.
Hier ist der Code der Klasse ImageDisplay, die von der Scan-GUI gestartet wird.
Code:
public class ImageDisplay extends Thread//implements Runnable
{
private String scannedPart;
private static JDialog dialog;
private String[] files;
private JFrame parent;
private BufferedImage secondImage, firstImage;
private boolean _stop;
private TelegramReader tReader;
private ImageCreator iCreator;
private Thread iThread;
private String _filename;
private boolean _2ndImageShown;
/**
*
Konstruktor, dem der eingescannte String Ÿbergeben wird.
* @param s - der eingescannte String
*/
public ImageDisplay(String s, JFrame parent)
{
scannedPart = s;
File dir = new File(ErrorEditor.userDir + File.separator + "fzsnr");
files = dir.list();
this.parent = parent;
tReader = new TelegramReader();
iCreator = new ImageCreator();
iThread = new Thread(iCreator);
}
public void stopImageCreator()
{
iThread.interrupt();
}
public void stopDisplay()
{
_stop = true;
}
public boolean stopped()
{
return _stop;
}
public void startDisplay()
{
_stop = false;
}
/**
* Speichert das zweite Bild im Speicher.
* @param img - das Bild
*/
protected void setSecondImage(BufferedImage img)
{
secondImage = img;
}
/**
* Speichert das erste Bild im Speicher.
* @param img - das Bild
*/
protected void setFirstImage(BufferedImage img)
{
firstImage = img;
}
/**
* Lässt das Fenster verschwinden.
*/
public void dispose()
{
if(dialog != null)
{
dialog.dispose();
}
}
public void setFilename(String s)
{
_filename = s;
}
/**
*
Diese Methode erstellt ein JFrame und fŸgt ihm ein ImageCanvas hinzu * mit dem entsprechenden Bild, falls ein Bild, das zum eingescannte String passt, * vorhanden ist.
*/
public void run()
{
_2ndImageShown = true;
TeileScanner ts = new TeileScanner();
ts.resetFocus();
ErrorWriter ew = new ErrorWriter();
ew.openPropertiesFile();
dialog = new JDialog(parent, scannedPart, false);
//dialog = new JFrame(scannedPart);
dialog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for (int i=1; i<3; i++) {
Info info = tReader.readTelegramForOneInfo(_filename);
System.out.println("I "+i);
if(info == null)
{
JOptionPane.showMessageDialog(null, "blabla.",
"Fehler", JOptionPane.ERROR_MESSAGE);
ts.resetFocus();
return;
}
if(i==1)
{
info.setError(ew.getProperty(info.getMTNr1(), info.getLack()));
iCreator.setHashtable(info);
iCreator.setWhichMatNr(i);
iThread.start();
while(!iCreator.imageCreated())
{
}
setFirstImage(iCreator.getImage());
System.out.println("Erstes Bild gesetzt!");
}
//else if(info.getMTNr2() != null && info.getMTNr2().length() > 1)
if(!_stop)
{
if(i==2) {
info.setError(ew.getProperty(info.getMTNr2(), info.getLack()));
iCreator.setHashtable(info);
iCreator.setWhichMatNr(i);
iThread.start();
while(!iCreator.imageCreated())
{
}
setSecondImage(iCreator.getImage());
//setSecondImage(iCreator.createImage(false));
}
}
}
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension screenSize = tk.getScreenSize();
ImageCanvas canvas = null;
//ErrorWriter ew = new ErrorWriter();
canvas = new ImageCanvas(firstImage, firstImage.getWidth(),
firstImage.getHeight());
dialog.getContentPane().add(canvas);
dialog.setSize(screenSize.width, screenSize.height);
//frame.pack();
dialog.setVisible(true);
try
{
//supposed to show the image for a certain time (e.g 5 secs)
this.sleep(ew.readTimeToWait()+2000);
}
catch(InterruptedException ie)
{
System.err.println("Fehler beim Warten");
}
dialog.remove(canvas);
dialog.validate();
//dialog.dispose();
//dialog.setVisible(false);
_2ndImageShown = false;
canvas = new ImageCanvas(secondImage, secondImage.getWidth(),
secondImage.getHeight());
dialog.getContentPane().add(canvas);
dialog.setSize(screenSize.width, screenSize.height);
dialog.validate();
_2ndImageShown = true;
try
{
//supposed to show the image for a certain time (e.g 5 secs)
this.sleep(ew.readTimeToWait());
}
catch(InterruptedException ie)
{
System.err.println("Fehler beim Warten");
}
dialog.dispose();
ts = new TeileScanner();
ts.resetFocus();
}
public boolean secImageShown()
{
return _2ndImageShown;
}
public void setSecImageShown(boolean b)
{
_2ndImageShown = b;
}
}