aboutsummaryrefslogtreecommitdiff
path: root/src/main/ui/widgets/QRPanel.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/ui/widgets/QRPanel.java')
-rw-r--r--src/main/ui/widgets/QRPanel.java77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/main/ui/widgets/QRPanel.java b/src/main/ui/widgets/QRPanel.java
new file mode 100644
index 0000000..d72d0d0
--- /dev/null
+++ b/src/main/ui/widgets/QRPanel.java
@@ -0,0 +1,77 @@
+package ui.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();
+ }
+}