Apka do skanowania kodów kreskowych za pomocą czytnika (gun na usb)

0

witam, od jakiegoś czasu uczę się javy przy wykorzstaniu spring boot, do budowaniu aplikacji webowych ale wpadł mi temat zrobienia "prostej" apki desktopowej.

Apka ma posłużyc do tworzenia logów ze skanowania kodów kreskowych za pomocą czytników kodów kreskowych (gun laserowy na usb) )
Logi ze skanów mają być wyświetlane przy użyciu prostego okna np Jframe oraz Jtextfield

Znalazłem podobny problem na stack overflow i "rozwiązanie" poniżej

Rozumie go w 80%, ale nie umię iterować po liście listeners(CopyOnWriteArrayList) i przekazać jej elementy do GUI

W klasie zagnieżdzony jest interface ale nic nie zwracający.

Potrzebuje drobnej pomocy, wskazówek od czego zacząć na zasadzie kroków.

'''public class BarcodeReader {

private static final long THRESHOLD = 100;
private static final int MIN_BARCODE_LENGTH = 8;


private final StringBuffer barcode = new StringBuffer();
private final List<BarcodeListener> listeners = new CopyOnWriteArrayList<BarcodeListener>();
private long lastEventTimeStamp = 0L;

public interface BarcodeListener {

    void onBarcodeRead(String barcode);
    

}

public BarcodeReader() {

    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
        @Override
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getID() != KeyEvent.KEY_RELEASED) {
                return false;
            }

            if (e.getWhen() - lastEventTimeStamp > THRESHOLD) {
                barcode.delete(0, barcode.length());
            }

            lastEventTimeStamp = e.getWhen();

            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                if (barcode.length() >= MIN_BARCODE_LENGTH) {
                    fireBarcode(barcode.toString());
                }
                barcode.delete(0, barcode.length());
            } else {
                barcode.append(e.getKeyChar());
            }
            return false;
        }
    });

}

protected void fireBarcode(String barcode) {
    for (BarcodeListener listener : listeners) {
        listener.onBarcodeRead(barcode);
       
    }
}

public void addBarcodeListener(BarcodeListener listener) {
    listeners.add(listener);
}

public void removeBarcodeListener(BarcodeListener listener) {
    listeners.remove(listener);
}

}'''
0
  1. Sformatuj kod w poście.
  2. Zamień CopyOnWriteArrayList na ArrayList jak się nie będzie sypać to spoko.
  3. Nie pisz apek desktopowych w Swingu tylko w JavaFX.
0

sorki za formatowanie, już poprawiam

package BarcodeReader.BarcodeReader.entities;

import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import org.springframework.stereotype.Component;

@Component
public class BarcodeReader  {
	
	public interface BarcodeListener {

	    void onBarcodeRead(String barcode);
	    
   	
	}

	
	private static final long THRESHOLD = 100;
	private static final int MIN_BARCODE_LENGTH = 8;


	private final StringBuffer barcode = new StringBuffer();
	//private final List<BarcodeListener> listeners = new CopyOnWriteArrayList<BarcodeListener>();
	private final List<BarcodeListener> listeners = new ArrayList<BarcodeListener>();
	private long lastEventTimeStamp = 0L;

	public BarcodeReader() {

	    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
	        @Override
	        public boolean dispatchKeyEvent(KeyEvent e) {
	            if (e.getID() != KeyEvent.KEY_RELEASED) {
	                return false;
	            }

	            if (e.getWhen() - lastEventTimeStamp > THRESHOLD) {
	                barcode.delete(0, barcode.length());
	            }

	            lastEventTimeStamp = e.getWhen();

	            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
	                if (barcode.length() >= MIN_BARCODE_LENGTH) {
	                    fireBarcode(barcode.toString());
	                }
	                barcode.delete(0, barcode.length());
	            } else {
	                barcode.append(e.getKeyChar());
	            }
	            return false;
	        }
	    });

	}

	protected void fireBarcode(String barcode) {
	    for (BarcodeListener listener : listeners) {
	        listener.onBarcodeRead(barcode);
	       
	    }
	}

	public void addBarcodeListener(BarcodeListener listener) {
	    listeners.add(listener);
	}

	public void removeBarcodeListener(BarcodeListener listener) {
	    listeners.remove(listener);
	}

	}
```
0
dawid Rat napisał(a):

sorki za formatowanie, już poprawiam

package BarcodeReader.BarcodeReader.entities;

import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import org.springframework.stereotype.Component;

@Component
public class BarcodeReader  {
	
	public interface BarcodeListener {

```

Czekaj czekaj, ty chcesz Swinga ze Springiem po stronie klienta łączyć? Oj nie byczq -1. Wracaj do podstaw.

0
MrMadMatt napisał(a):
dawid Rat napisał(a):

sorki za formatowanie, już poprawiam

package BarcodeReader.BarcodeReader.entities;

import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import org.springframework.stereotype.Component;

@Component
public class BarcodeReader  {
	
	public interface BarcodeListener {

```

Czekaj czekaj, ty chcesz Swinga ze Springiem po stronie klienta łączyć? Oj nie byczq -1. Wracaj do podstaw.

Nie chce zrobić aplikacji webowej, chce zrobić apke desktopową przy wykorzystaniu spring boota i mavena do pociągniecia zależności ( podobno spring nie służy jedynie do budowania web app :) )

Ps: czy w kodzie co wkleiłem nie jest wykorzystany wzorzec projektowy? a jak tak to jaki?

0

Można powiedzieć że temat rozwiązany.

Potwierdziły się moje przypuszczenia że jest to wzorzeć projektowy, jak się okazało dość popularny bo Observer pattern, ale dla świeżaka jak ja, nie jest to oczywiste ;)

Dla osób, które kiedyś będa miały podobny problem, to żeby zastosować klasę powyżej (jest to klasa observable) to należy stworzyć jeszcze drugą klase (observer), która będzie implementować interface BarcodeListener ( ten inteface znajduje się w klasie observable) .

Następnym krokiem, jest utworzenie instacji BarcodeReader oraz utworzenie instacji klasy która będzie obserwatorem ( tych klas obserwujących może być więcej niż jedna bo właśnie o to chodzi przy zastosowaniu tego wzorca)

W moim wypadku klasa obserwującay wygląda tak

package BarcodeReader.BarcodeReader;

import BarcodeReader.BarcodeReader.entities.BarcodeReader.BarcodeListener;

public class barcodeobserver implements BarcodeListener{
	String barcode;
	
	public String getBarcode() {
		return barcode;
	}

	@Override
	public void onBarcodeRead(String barcode) {
		this.barcode = barcode;
		System.out.println(barcode);
		
	}

}

Potem należy tylko dodać metodą addBarcodeListener waszą lub wasze klasy obserwujące.


		BarcodeReader barreader = new BarcodeReader();
		barcodeobserver barobserver = new barcodeobserver();
		barreader.addBarcodeListener(barobserver);
0
MrMadMatt napisał(a):
  1. Nie pisz apek desktopowych w Swingu tylko w JavaFX.

A dlaczego?

0
AnyKtokolwiek napisał(a):
MrMadMatt napisał(a):
  1. Nie pisz apek desktopowych w Swingu tylko w JavaFX.

A dlaczego?

  1. Bo FXML'e design widoków/formatek/paneli znajduje się poza kodem Java.
  2. Bo CSS w FXML
  3. Bo lepiej ogarnia wzorzec MVC.
  4. Bo posiada dedykowany mechanizm bindingów między klasami modelowymi a kontrolkami.
  5. Bo nowsze.
  6. Bo NASA robi w nim apki:
    I tyle jeżeli chodzi o topowe argumenty.
2
  1. XML zaleta lub wada, zależnie od preferencji

  2. Być może potrzebujesz CSS. Ja na desktopie nigdy nie potrzebowałem "bajerów". Aplikacja przez elementy webowe lżejsza się przez to na pewno nie zrobi

  3. nowszy ale szybciej ubity

1 użytkowników online, w tym zalogowanych: 0, gości: 1