- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做这个作业,制作一个解决数独的程序。我有一个带有 SudokuTextBox 网格扩展 JFormattedTextField 的面板。我有一个 MaskFormatter,因此每个文本框只接受一个整数。然后在我的面板中,当释放按键时,我会看到此代码。
public void keyReleased(KeyEvent e) {
SudokuTextBox tb = (SudokuTextBox) e.getSource();
int row = tb.getRow();
int col = tb.getCol();
int value = toInteger(tb.getText());
//System.out.println(value);
if(sudoku.isValid(row, col, value)) {
sudoku.set(row, col, value);
}
else {
sudoku.set(row, col, 0);
tb.setText(null);
}
tb.setCaretPosition(0);
sudoku.print();
}
问题是,如果我在文本框中输入有效值,然后我返回并输入无效值(根据数独规则),文本框将被清除。但是,当我向前移动时,前一个有效值将显示在文本框中。我的数独矩阵包含所有已输入的数字,它会像应有的那样清除该值,因此它仅位于相应的文本框中。
为了让事情变得更加困惑,当我将“SudokuTextBox extends JFormattedTextField”更改为“SudokuTextBox extends JTextField”时,它就像一个魅力。但我无法设置 JTextField 的大小,使其成为正方形,并且我无法强制每个文本框仅使用一个整数。
我是否遗漏了一些非常明显的东西?
最佳答案
这是一个可能适合此类游戏的可调整大小组件的示例。尽管它不包含游戏逻辑,但它可以很好地处理输入。单击鼠标或按空格键会弹出一个菜单,并且制表符和数字键按预期工作。特别是,Digit.EMPTY
是一个有效值。
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.EnumSet;
import javax.swing.*;
/** @see http://stackoverflow.com/questions/4148336 */
public class CellTest extends JPanel {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
//@Override
public void run() {
createGUI();
}
});
}
public static void createGUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(3, 3));
for (Digit d : Digit.digits) {
frame.add(new CellTest(d));
}
frame.pack();
frame.setVisible(true);
}
CellTest(Digit digit) {
this.setLayout(new BorderLayout());
this.setBorder(BorderFactory.createLineBorder(Color.black, 1));
this.setBackground(new Color(0x00e0e0));
JLabel candidates = new JLabel("123456789");
candidates.setHorizontalAlignment(JLabel.CENTER);
this.add(candidates, BorderLayout.NORTH);
JDigit cellValue = new JDigit(digit);
add(cellValue, BorderLayout.CENTER);
}
}
class JDigit extends JButton {
private static final int SIZE = 128;
private static final int BASE = SIZE / 32;
private static final Font FONT = new Font("Serif", Font.BOLD, SIZE);
private JPopupMenu popup = new JPopupMenu();
private Digit digit;
private Image image;
private int width, height;
public JDigit(Digit digit) {
this.digit = digit;
this.image = getImage(digit);
this.setPreferredSize(new Dimension(64, 64));
this.setBackground(new Color(0xe0e000));
this.setForeground(Color.black);
this.setBorderPainted(false);
this.setAction(new ButtonAction());
this.addFocusListener(new FocusHandler());
for (Digit d : Digit.values()) {
Action select = new SelectAction(d);
JMenuItem item = new JMenuItem(select);
getInputMap().put(KeyStroke.getKeyStroke(
KeyEvent.VK_0 + d.value(), 0), d.toString());
getInputMap().put(KeyStroke.getKeyStroke(
KeyEvent.VK_NUMPAD0 + d.value(), 0), d.toString());
getActionMap().put(d.toString(), select);
popup.add(item);
}
}
public Digit getDigit() {
return digit;
}
public void setDigit(Digit digit) {
this.digit = digit;
this.image = getImage(digit);
this.repaint();
}
@Override
protected void paintComponent(Graphics g) {
int w = this.getWidth();
int h = this.getHeight();
g.setColor(this.getBackground());
int dx1 = w * width / height / 4;
int dx2 = w - dx1;
g.fillRect(dx1, 0, dx2 - dx1, h);
g.drawImage(image,
dx1, 0, dx2, h,
0, 0, width, height, null);
}
private Image getImage(Digit digit) {
BufferedImage bi = new BufferedImage(
SIZE, SIZE, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = bi.createGraphics();
g2d.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(this.getForeground());
g2d.setFont(FONT);
FontMetrics fm = g2d.getFontMetrics();
width = fm.stringWidth(digit.toString());
height = fm.getAscent();
g2d.drawString(digit.toString(), 0, height - BASE);
g2d.dispose();
return bi;
}
private class ButtonAction extends AbstractAction {
//@Override
public void actionPerformed(ActionEvent e) {
popup.show(JDigit.this, getWidth() - width, getHeight() / 2);
}
}
private class SelectAction extends AbstractAction {
private Digit digit;
public SelectAction(Digit digit) {
this.digit = digit;
this.putValue(Action.NAME, digit.toString());
}
//@Override
public void actionPerformed(ActionEvent e) {
setDigit(digit);
}
}
private class FocusHandler implements FocusListener {
private Color background = getBackground();
//@Override
public void focusGained(FocusEvent e) {
setBackground(background.brighter());
}
//@Override
public void focusLost(FocusEvent e) {
setBackground(background);
}
}
}
enum Digit {
EMPTY(0, " "), ONE(1, "1"), TWO(2, "2"), THREE(3, "3"), FOUR(4, "4"),
FIVE(5, "5"), SIX(6, "6"), SEVEN(7, "7"), EIGHT(8, "8"), NINE(9, "9");
public static EnumSet<Digit> digits = EnumSet.range(Digit.ONE, Digit.NINE);
private int i;
private String s;
Digit(int i, String s) {
this.i = i;
this.s = s;
}
@Override
public String toString() {
return s;
}
public int value() {
return i;
}
}
关于java - JFormattedTextField 未正确清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4148336/
我有一个带有 DateFormat 的 JFormattedTextField。格式为“ddMMyy”。这种格式允许快速输入。当焦点丢失时,我希望字段中的文本更改为 LocalDate,因为这样更易于
嘿伙计们,我想知道是否可以将 JFormattedTextField 设置为具有电子邮件输入的自动格式。例如,当用户输入电子邮件地址时,我希望它接受如下内容:jsmith1@smith.com 但我希
我在代码中使用时间时遇到了一些麻烦: txtDauer = new JFormattedTextField(); txtDauer.setFormatterFactory(new DefaultFor
我想使用 JFormattedTextField 将 float 格式化为百分比值,允许输入从 0 到 100%(转换为 0.0f-1.0f),始终显示百分号并不允许任何无效字符。 现在我对 Numb
我有此代码,但无法正确获取MaskFormatter maskformatter MaskFormatter formatter = null; try { formatter = new
我正在扩展 JFormattedTextField 以添加监听器。我已经完成了这项工作,尽管这可能不是最好的方法。没有办法使用单个泛型构造函数吗? public class TimeLineTextC
我想获取 JFormattedTextField 的值并将其转换为字符串这是我的 JFormattedTextField 代码 这是我的代码: public void formattedTextFie
我有一个字符数组列表,还有一个返回字符串的 JTextField。我想知道如何只允许输入字符?或者也许我如何只允许传递字符串的第一个字母? 最佳答案 所以您只想允许输入某些字符,即由ArrayList
我正在做这个作业,制作一个解决数独的程序。我有一个带有 SudokuTextBox 网格扩展 JFormattedTextField 的面板。我有一个 MaskFormatter,因此每个文本框只接受
我正在尝试在 Beanshell 中创建一个简单的对话框 - 它应该读取三个可编辑文本字段的内容,并在按下按钮时相应地执行一个简单的任务。我完全被一个错误所困扰,我无法阅读某些字段中的文本。 代码如下
我有一个用于“名称”字段的 jFormattedTextFiled。我必须限制字段只能输入 25 个字符。如果输入更多,则必须显示一些消息...对于消息我可以使用 JOptionpane.. 我该怎么
我有一个正在使用代码初始化的 JFormattedTextField JFormattedTextField f = new JFormattedTextField(createFormatter()
假设JFormattedTextField已启用并包含格式化程序,有没有办法使其只读?使用JTextField,我们只需要提供一个自定义文档并在那里进行所有控制,但是使用JFormattedTextF
我需要一个限制为小数点后 3 位的 JTextField。经过搜索,我发现了 JFormattedTextField,它看起来很棒。现在的代码是: try { double aux = 25.
我的 GUI 程序中有以下 JFormattedTextField。 DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); JFormattedTex
如何编写 JFormattedTextField 代码以接受不带小数的货币格式? 我尝试到处寻找答案。具体来说,是 Oracle、Google 和 Code Ranch。 我的问题:如何对格式化文本字
我在这里遇到麻烦了,我正在尝试创建一个创建 JFormattedTextFields 的类,它可以工作,但我需要获取它的值,那就是我得到 NullPointerExeption 的时候,这是我的代码:
我正在使用 GUI 制作一个小型数独游戏,并为 JFormattedTextFields 使用 MaskFormatter: formatter = new MaskFormatter(s); f
我一直在学习更多与 Java GUI 相关的知识。但是,我遇到了一个问题,不确定如何解决。 我有一部分程序(如下所示,但不相关的代码已被删除),除了 JFormattedTextField 变量 (s
由于有人错误地将我的另一个问题( NumberFormat parse not strict enough )标记为重复,并且尽管我指出它是不同的但没有删除重复的标签,所以我将再次发布该问题以及我的解
我是一名优秀的程序员,十分优秀!