我有以下示例类,它使用 uk.co.mmscomputing.device.scanner.Scanner 类连接到 twain.dll 驱动程序来扫描页面:
public class ScannerManager implements ScannerListener{
static ScannerManager app;
Scanner scanner;
String fileName;
public ScannerManager() throws ScannerIOException{
scanner=Scanner.getDevice();
scanner.addListener(this);
scanner.acquire();
}
public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata){
if(type.equals(ScannerIOMetadata.ACQUIRED)){
BufferedImage image=metadata.getImage();
System.out.println("ACQUIRED!");
String file = UIMessages.showInputMessage("Enter file name");
try{
ImageIO.write(image, "png", new File(Constants.getPathBusta() + File.separatorChar + file));
fileName = Constants.getPathBusta() + File.separatorChar + file;
}catch(Exception e){
e.printStackTrace();
}
}else if(type.equals(ScannerIOMetadata.NEGOTIATE)){
ScannerDevice device=metadata.getDevice();
try{
device.setShowUserInterface(true);
device.setShowProgressBar(true);
device.setResolution(100);
}catch(Exception e){
e.printStackTrace();
}
}else if(type.equals(ScannerIOMetadata.STATECHANGE)){
System.err.println(metadata.getStateStr());
if(metadata.isFinished()){
System.exit(0);
}
}else if(type.equals(ScannerIOMetadata.EXCEPTION)){
metadata.getException().printStackTrace();
}
}
public static void main(String[] argv){
try{
app=new ScannerManager( );
}catch(Exception e){
e.printStackTrace();
}
}
}
在运行主方法时它工作得很好,但是我需要从 Swing jButton 点击事件中调用它: 令人惊讶的是,它的工作原理并不相同:
buttonAcquire.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
ScannerManager scanner = new ScannerManager();
} catch (ScannerIOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
defaultCursor();
}
}
});
条件:
if(type.equals(ScannerIOMetadata.ACQUIRED))
从未满足,因此从 Swing 线程执行时事件似乎没有被正确拦截。你能给我任何提示吗?我真的很困惑,我不知道可能是什么问题......
最佳答案
尝试让 Swing 类本身监听 ScannerListener 事件。换句话说,将代码移动到 Swing UI 部分并查看它是否有效。
关于java - 监听器在 Swing 应用程序中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27418446/