2012-05-22 3 views
3

Я использую эту библиотеку mmscomputing как java-апплет для сканирования изображения или документа. Используя качели, я создал одну кнопку сканирования, которая приобретает сканер, вызывая метод scanner.acquire() mmscomputing jar.uk.co.mmscomputing twain scanner

, а затем размещение этого отсканированного изображения в jpanel для отображения.

Проблема в том, что когда я запускаю свой апплет и нажимаю кнопку сканирования. .. ..съемка работает нормально. 3. Включает: 3,4,5,6,7,5,4,3

затем второй раз, снова ударился кнопка сканирования .. Твен утверждает, что входит в это: 3,4,5,4,3

это не собирается в передачу изображения готового и передача состояния и, следовательно, не в код ниже еСЛИ петля

, если (type.equals (ScannerIOMetadata.ACQUIRED))

, так что я не могу увидеть новое сканированное изображение в моем jpanel во второй раз ...

затем третий раз, нажав на кнопку сканирования ... снова он отлично работает .. попадает во все состояния. Итак, я имею в виду, для альтернативы снова или снова запускается Java-апплет ..it работает. какой будет проблема ..?

Я хочу, каждый раз, когда я нажимаю кнопку сканирования, он должен получить мне новое изображение в Jpanel .. но он делает альтернативные времена. Могу ли я явным образом установить или изменить два состояния, чтобы войти в 6-е и 7-е состояния. или есть ли проблема с инициализацией источника twain во второй раз? , потому что перезапуск апплета выполняется отлично каждый раз .. или какой-то способ повторно инициализировать объекты апплета каждый раз при нажатии кнопки сканирования .., было бы так, что я буду перезапустить апплет каждый раз при нажатии кнопки сканирования ...

Я не получаю это ..

Ниже приведен пример кода:

import uk.co.mmscomputing.device.twain.TwainConstants; 
import uk.co.mmscomputing.device.twain.TwainIOMetadata; 
import uk.co.mmscomputing.device.twain.TwainSource; 
import uk.co.mmscomputing.device.twain.TwainSourceManager; 


public class XXCrop extends JApplet implements PlugIn, ScannerListener 
{ 

    private JToolBar jtoolbar = new JToolBar("Toolbar", JToolBar.HORIZONTAL); 
    ImagePanel ipanel; 
    Image im =null; 
    BufferedImage imageforCrop; 
    ImagePlus imp=null; 
    int imageWidth; 
    int imageHeight; 
    private static final long serialVersionUID = 1L; 
    Container content = null; 
    private JPanel jContentPane = null; 
    private JButton jButton = null; 
    private JButton jButton1 = null; 
    JCheckBox clipBox = null; 
    JPanel crpdpanel=null; 
    JPanel cpanel=null; 
    private Scanner scanner=null; 
    private TwainSource ts ; 
    private boolean  is20; 






    ImagePanel imagePanel,imagePanel2 ; 




    public static void main(String[] args) { 
     new XXCrop().setVisible(true); 
    } 

    public void run(String arg0) { 

     new XXCrop().setVisible(false); 
     repaint(); 
    } 

    /** 
    * This is the default constructor 
    */ 
    public XXCrop() { 
     super(); 
     init(); 
     try { 
      scanner = Scanner.getDevice(); 

      if(scanner!=null) 
      { 
      scanner.addListener(this); 
      } 

     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 


    } 

    /** 
    * This method initializes this 
    * 
    * @return void 
    */ 
    public void init() 
    { 
     this.setSize(1200, 600); 
     this.setLayout(null); 
     //this.revalidate(); 
     this.setContentPane(getJContentPane()); 
    } 



    private JToolBar getJToolBar() 
    { 
     jtoolbar.add(getJButton1()); 
     jtoolbar.add(getJButton()); 


     jtoolbar.setName("My Toolbar"); 
     jtoolbar.addSeparator(); 
     Rectangle r=new Rectangle(0, 0,1024, 30); 
     jtoolbar.setBounds(r); 
     return jtoolbar; 
    } 

    private JPanel getJContentPane() 
    { 
     if (jContentPane == null) 
     { 
      jContentPane = new JPanel(); 
      jContentPane.setLayout(null); 
      jContentPane.add(getJToolBar()); 
     } 
     return jContentPane; 
    } 


    private JButton getJButton() { 
     if (jButton == null) { 
      jButton = new JButton(); 
      jButton.setBounds(new Rectangle(4, 16, 131, 42)); 
      jButton.setText("Select Device"); 
      jButton.addActionListener(new java.awt.event.ActionListener() { 
       public void actionPerformed(java.awt.event.ActionEvent e) { 
        if (scanner.isBusy() == false) { 
         selectDevice(); 
        } 

       } 
      }); 
     } 
     return jButton; 
    } 


    /* Select the twain source! */ 
    public void selectDevice() { 

     try { 
      scanner.select(); 
     } catch (ScannerIOException e1) { 
      IJ.error(e1.toString()); 
     } 

    } 

    private JButton getJButton1() 
    { 
     if (jButton1 == null) { 
      jButton1 = new JButton(); 
      jButton1.setBounds(new Rectangle(35,0, 30, 30)); 
      jButton1.setText("Scan"); 
      jButton1.addActionListener(new java.awt.event.ActionListener() { 
       public void actionPerformed(java.awt.event.ActionEvent e) 
       {//jContentPane.remove(crpdpanel); 
        //jContentPane.removeAll(); 
       //jContentPane.repaint(); 
       //jContentPane.revalidate(); 

        getScan(); 
       } 
      }); 
     } 
     return jButton1; 
    } 

    public void getScan() 
    { 

     try 
     { 


     //scanner = Scanner.getDevice(); 
     //scanner.addListener(this); 
      scanner.acquire(); 
     } 
     catch (ScannerIOException e1) 
     { 
      IJ.showMessage("Access denied! \nTwain dialog maybe already opened!"); 
      e1.printStackTrace(); 
     } 
    } 


    public Image getImage() 
    { 
     Image image = imp.getImage(); 
     return image; 
    } 


    /*Image cimg; 

    public Image getCimg() 
     { 
      return cimg; 
     }*/ 

    public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata) { 



     if (type.equals(ScannerIOMetadata.ACQUIRED)) 
     { 

      //imagePanel.revalidate(); 
      //imagePanel.repaint(); 
      //imagePanel.invalidate(); 

      //jContentPane.remove(ipanel); 
      //ipanel.repaint(); 


    if(imp!=null) 
    { 
     jContentPane.remove(ipanel); 
     jContentPane.remove(cpanel); 
     jContentPane.remove(crpdpanel); 
    } 


      imp = new ImagePlus("Scan", metadata.getImage()); 
      //imp.show(); 
      im = imp.getImage(); 


      //imagePanel = new ImagePanel(im,imageWidth,imageHeight); 
      imagePanel = new ImagePanel(im); 
      imagePanel.updateUI(); 

      imagePanel.repaint(); 
      imagePanel.revalidate(); 

      ClipMover mover = new ClipMover(imagePanel); 
      imagePanel.addMouseListener(mover); 
      imagePanel.addMouseMotionListener(mover); 

       ipanel = imagePanel.getPanel(); 

      ipanel.setBorder(new LineBorder(Color.blue,1)); 
      ipanel.setBorder(BorderFactory.createTitledBorder("Scanned Image")); 
      ipanel.setBounds(0, 30,600, 600); 
      ipanel.repaint(); 
      ipanel.revalidate(); 
      ipanel.updateUI(); 
      jContentPane.add(ipanel); 
      jContentPane.getRootPane().revalidate(); 
      jContentPane.updateUI(); 
      //jContentPane.repaint(); 

      // cimg=imagePanel.getCimg(); 

      // ImagePanel cpanel = (ImagePanel) imagePanel.getUIPanel(); 
      /* 
      cpanel.setBounds(700, 30,600, 800); 
      jContentPane.add(imagePanel.getUIPanel()); 
      */ 
       cpanel = imagePanel.getUIPanel(); 
      cpanel.setBounds(700, 30,300, 150); 
      cpanel.repaint(); 
      cpanel.setBorder(new LineBorder(Color.blue,1)); 
      cpanel.setBorder(BorderFactory.createTitledBorder("Cropping Image")); 
      jContentPane.add(cpanel); 


      jContentPane.repaint(); 
      jContentPane.revalidate(); 




      metadata.setImage(null); 
      try { 
       new uk.co.mmscomputing.concurrent.Semaphore(0, true).tryAcquire(2000, null); 
      } catch (InterruptedException e) { 
       IJ.error(e.getMessage()); 

      } 

     } 




     else if (type.equals(ScannerIOMetadata.NEGOTIATE)) { 
      ScannerDevice device = metadata.getDevice(); 
      try { 
       device.setResolution(100); 
      } catch (ScannerIOException e) { 
       IJ.error(e.getMessage()); 
      } 

       try{ 
       device.setShowUserInterface(false); 
      // device.setShowProgressBar(true); 
     // device.setRegionOfInterest(0,0,210.0,300.0); 
       device.setResolution(100); }catch(Exception e){ 
       e.printStackTrace(); } 

     } 


     else if (type.equals(ScannerIOMetadata.STATECHANGE)) { 
      System.out.println("Scanner State "+metadata.getStateStr()); 
      System.out.println("Scanner State "+metadata.getState()); 
      //switch (metadata.ACQUIRED){}; 
      ts = ((TwainIOMetadata)metadata).getSource(); 
     //ts.setCancel(false); 
      //ts.getState() 
      //TwainConstants.STATE_TRANSFERREADY 
      ((TwainIOMetadata)metadata).setState(6); 
      if ((metadata.getLastState() == 3) && (metadata.getState() == 4)){} 
      // IJ.error(metadata.getStateStr()); 
     } 

     else if (type.equals(ScannerIOMetadata.EXCEPTION)) { 
      IJ.error(metadata.getException().toString()); 
     } 


    } 


    public void stop(){             // execute before System.exit 
      if(scanner!=null){             // make sure user waits for scanner to finish! 
       scanner.waitToExit(); 

        ts.setCancel(true); 

        try { 
         scanner.setCancel(true); 
        } catch (ScannerIOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
      } 
      } 

ответ

3

Я не эксперт, но когда ScannerIOMetadata.STATECHANGE не следует проверить, если сканирование завершено?

И если это так, вы должны снова инициализировать сканер.

Нечто подобное:

if (metadata.isFinished()) 
{ 
    twainScanner = (TwainScanner) Scanner.getDevice(); 
}