2015-11-25 6 views
0

Желаемая функциональность: прослушивание штрих-кодов с линейной разверткой (строка символов). Для каждой пары (всегда сканируемой в том же порядке, один длиннее другого), сравните два для равенства. Если они одинаковы, отобразите изображение. Если они разные, отобразите другое изображение. Повторяйте бесконечно, пока окно не будет закрыто.Сравнение двух строк и отображение изображения на основе результата

В моей голове есть два модуля для этой программы. Один из них постоянно зацикливается, принимает строки, сравнивает и отправляет результат (== or! =). Другой просто ждет результата, отображает соответствующее изображение и ждет следующего результата сравнения.

Код, который у меня есть, ниже, и я не могу окутать голову, как заставить repaint() работать должным образом в конце каждого цикла (как только результат сравнения известен). Я попытался вытолкнуть результат в класс MyFrame и перерисовать() там, и я попытался вызвать repaint() в цикле, но это тоже не сработает.

ScannerCompare Class работает сам по себе в консоли, но это не будет очень полезно для моей предполагаемой реализации. Если бы были только снимки System.out.println («ОК») и («NG»)!

Большое спасибо!

package BarcodeVerification; 

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Image; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.WindowConstants; 


public class MyFrame extends JFrame { 

private Image ngImage = null; 
private Image okImage = null; 

public MyFrame(String ngFilename, String okFilename) { 
    setTitle("MyWindow"); 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    setSize(800, 600); 

    this.ngImage = new ImageIcon(ngFilename).getImage(); 
    this.okImage = new ImageIcon(okFilename).getImage(); 

    Container container = getContentPane(); 
    container.setLayout(new BorderLayout()); 

} 

@Override 
public void paint(Graphics g) { 
    super.paint(g); 

    if (m.getResult()) { 
     g.drawImage(okImage, 0, 0, okImage.getWidth(null), okImage.getHeight(null), null); 
    } 
    else { 
     g.drawImage(ngImage, 0, 0, ngImage.getWidth(null), ngImage.getHeight(null), null); 
    } 
} 

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      MyFrame frame = new MyFrame("src/NG.png","src/OK/png"); 
      ScannerCompare m = new ScannerCompare(); 
      frame.setVisible(true); 
     } 

    }); 
} 
} 



package BarcodeVerification; 

import java.util.Scanner; 


public class ScannerCompare { 

public Boolean ok; 
public String scan1, scan2, injectorExtract; 

public ScannerCompare(){ 
Scanner in = new Scanner(System.in); 

    while (true) { 
     System.out.println("Scan the paper"); 
     scan1 = in.nextLine(); 

     System.out.println("Scan the Injector QR Code"); 
     scan2 = in.nextLine(); 

     injectorExtract = scan2.substring(19); 

     if (scan1.compareTo(injectorExtract) != 0) { 
      System.out.println("NG"); 
      ok = false; 
      repaint(); 
     } else { 
      System.out.println("OK"); 
      ok = true; 
      repaint() 
     } 
    } 
} 
public boolean getResult(){ 
    return ok; 
} 
} 
+0

Какое подключение 'ScannerCompare' к' MyFrame'? Как «ScannerCompare» влияет на любой экземпляр «MyFrame»? – MadProgrammer

+0

Не переопределяйте 'paint' контейнеров верхнего уровня, таких как' JFrame', вместо этого начинайте с такого компонента, как 'JPanel', и вместо этого переопределите его как метод paintComponent. См. [This] (http://stackoverflow.com/questions/13734069/how-can-i-set-in-the-midst/13734319#13734319) по крайней мере по одной причине, почему вы не должны переопределять 'paint' of контейнер верхнего уровня – MadProgrammer

+0

Возможно, вы также захотите посмотреть [Рабочие потоки и SwingWorker] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html) – MadProgrammer

ответ

1

Основная проблема может быть решена с использованием Observer Pattern.

«Сканер» проверяет результаты сканирования и генерирует какое-то событие/уведомления зарегистрированных/заинтересованные наблюдатели/слушатель

Свинга это однопоточные рамки, так что вы не можете просто поместить while (true) в ваш код, поскольку он может блокировать поток событий Dispatching, предотвращая его обработку любых событий, включая события рисования. См. Concurrency in Swing для более подробной информации.

Вы можете использовать SwingWorker к более приходит это ограничение, позволяя метод doInBackground обрабатывать сканы и publish/process методы для запуска уведомлений в контексте EDT безопасно см Worker Threads and SwingWorker для более подробной информации

Как доказательство концепции ...

import java.awt.BorderLayout; 
import javax.swing.ImageIcon; 
import java.awt.EventQueue; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.util.List; 
import java.util.Scanner; 
import javax.imageio.ImageIO; 
import javax.swing.Icon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingWorker; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Scanny { 

    public static void main(String[] args) { 
     new Scanny(); 
    } 

    public Scanny() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       try { 
        BufferedImage empty = ImageIO.read(...); 
        BufferedImage good = ImageIO.read(...); 
        BufferedImage bad = ImageIO.read(...); 

        JFrame frame = new JFrame("Testing"); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.add(new ScannerPane(new ImageIcon(empty), new ImageIcon(good), new ImageIcon(bad))); 
        frame.pack(); 
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public class ScannerPane extends JPanel { 

     private JLabel label; 
     private Icon empty; 
     private Icon good; 
     private Icon bad; 

     public ScannerPane(Icon empty, Icon good, Icon bad) { 
      setLayout(new BorderLayout()); 
      this.empty = empty; 
      this.good = good; 
      this.bad = bad; 

      label = new JLabel(empty, JLabel.CENTER); 
      add(label); 

      ScannerWorker worker = new ScannerWorker(new ScannerObserver() { 
       @Override 
       public void scanWasGood() { 
        label.setIcon(good); 
       } 

       @Override 
       public void scanWasBad() { 
        label.setIcon(bad); 
       } 
      }); 
      worker.execute(); 
     } 

    } 

    public interface ScannerObserver { 
     public void scanWasGood(); 
     public void scanWasBad(); 
    } 

    public class ScannerWorker extends SwingWorker<Void, Boolean> { 

     private ScannerObserver observer; 

     public ScannerWorker(ScannerObserver observer) { 
      this.observer = observer; 
     } 

     @Override 
     protected Void doInBackground() throws Exception { 
      Scanner in = new Scanner(System.in); 

      while (true) { 
       String scan1 = in.nextLine(); 
       String scan2 = in.nextLine(); 

       String injectorExtract = scan2.substring(19); 

       if (scan1.compareTo(injectorExtract) != 0) { 
        publish(Boolean.TRUE); 
       } else { 
        publish(Boolean.FALSE); 
       } 
      } 
     } 

     @Override 
     protected void process(List<Boolean> chunks) { 
      boolean last = chunks.get(chunks.size() - 1); 
      if (last) { 
       observer.scanWasGood(); 
      } else { 
       observer.scanWasBad(); 
      } 
     } 

    } 

} 

См Reading/Loading an Image для более подробной информации о ImageIO

+0

Спасибо! Много обратного проектирования делать ... Однако изображение не переключается. Раньше я мог набирать строку, нажимать enter (эмулируя то, что делает сканер штрих-кода), и я получаю результат. –

+0

Упс, забудьте начать «рабочий».Обновлено – MadProgrammer

+0

Еще раз спасибо - вы сделали всю работу, и вам я обязан своим кредитом. Теперь, когда я создаю и выполняю банку, это происходит [link] (http://imgur.com/8AuT0bR). Идеи? Программа отлично работает в Intellij ... –