Mon, 27 Jul 2020 12:08:23 +0200
fix: window cannot get smaller than the field
/* * Copyright 2013 Mike Becker. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ package de.uapcore.sudoku; import javax.swing.*; import java.awt.*; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; /** * A custom text field specifically for Sudoku number fields. */ public final class SudokuTextField extends JTextField { private boolean modified; public SudokuTextField() { setBorder(null); setBackground(Color.WHITE); setFont(new Font("Dialog", Font.PLAIN, 18)); setHorizontalAlignment(JTextField.CENTER); Dimension dim = new Dimension(40,40); setPreferredSize(dim); setMinimumSize(dim); setMaximumSize(dim); addKeyListener(new KeyAdapter() { private void handle(KeyEvent e) { char c = e.getKeyChar(); if (!e.isAltDown() && !e.isControlDown() && !Character.isISOControl(c)) { // Perform clean input check if (getText().length() > 0 && getSelectedText() == null) { if (c != KeyEvent.CHAR_UNDEFINED) { e.consume(); } } else { if (c < '1' || c > '9') { e.consume(); } else { setModified(true); } } } else { // We can still be tricked by hotkeys, so do it the hard way if (!getText().matches("^[1-9]$")) { setText(""); } } } @Override public void keyPressed(KeyEvent e) { handle(e); } @Override public void keyTyped(KeyEvent e) { handle(e); } @Override public void keyReleased(KeyEvent e) { handle(e); } }); addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { selectAll(); } @Override public void focusLost(FocusEvent e) { select(0, 0); } }); } /** * Returns the current value in the field or zero if the field is empty. * * @return the number from 1 to 9 or zero if empty */ public int getValue() { if (getText().isEmpty()) { return 0; } else { return Integer.parseInt(getText()); } } /** * Sets the field's value. * * @param v the number from 1 to 9 or zero to clear the field * @throws IllegalArgumentException if v is not between 0 and 9 */ public void setValue(int v) { if (v == 0) { setText(""); } else if (v > 0 && v < 10) { setText(String.valueOf(v)); } else { throw new IllegalArgumentException( "Sudoku numbers must be in range 0-9 (0 means 'not set')"); } } /** * Sets the modified state of this field. * * Modified fields are displayed in blue color. * * @param modified a flag indicating whether this field is modified */ public void setModified(boolean modified) { this.modified = modified; setForeground(modified?Color.BLUE:Color.BLACK); } /** * Checks whether this field is in modified state. * * @return true if this field is modified */ public boolean isModified() { return modified; } }