package ui.gui.widgets; import com.google.zxing.BarcodeFormat; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import javax.swing.*; import java.awt.*; import java.util.Collections; import static com.google.zxing.EncodeHintType.ERROR_CORRECTION; import static com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.L; /** * A fixed-size panel displaying a QR code. */ public class QRPanel extends JPanel { private final int size; private BitMatrix data; /** * EFFECTS: Init with the specific rectangular size. Min size = max size = preferred size. */ public QRPanel(int size) { super(); setSize(new Dimension(size, size)); setMaximumSize(new Dimension(size, size)); setMinimumSize(new Dimension(size, size)); setPreferredSize(new Dimension(size, size)); this.size = size; } /** * EFFECTS: Draw the QR code. Leave white if no data is set. * MODIFIES: this */ @Override protected void paintComponent(Graphics graphics) { super.paintComponent(graphics); graphics.setColor(Color.WHITE); graphics.fillRect(0, 0, size, size); if (data == null) { return; } graphics.setColor(Color.BLACK); for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { if (data.get(i, j)) { graphics.fillRect(i, j, 1, 1); } } } } /** * EFFECTS: Set data and repaint. Nullable. * MODIFIES: this */ public void setData(String data) { if (data == null) { this.data = null; invalidate(); return; } try { this.data = new QRCodeWriter().encode(data, BarcodeFormat.QR_CODE, size, size, Collections.singletonMap(ERROR_CORRECTION, L)); } catch (WriterException e) { e.printStackTrace(); } invalidate(); } }