Java 按下时更改JButton的文本

Java 按下时更改JButton的文本,java,swing,awt,jbutton,Java,Swing,Awt,Jbutton,我想更改按下JButton时的文本。到目前为止,按下按钮时文本确实会发生变化,但当我将鼠标移到按钮外时,文本会恢复到以前的状态(在本例中为空字符串)。如何确保文本在JButton上保持更改 这是我的密码: import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Tile extends JButto

我想更改按下JButton时的文本。到目前为止,按下按钮时文本确实会发生变化,但当我将鼠标移到按钮外时,文本会恢复到以前的状态(在本例中为空字符串)。如何确保文本在JButton上保持更改

这是我的密码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Tile extends JButton implements ActionListener {
    private int xPos, yPos;
    private char value;

    Tile(int x, int y) {
        xPos = x;
        yPos = y;
        setFont(this.getFont().deriveFont(Font.PLAIN, 45f));
        addActionListener(this);
    }

    @Override
    public int getX() {
        return xPos;
    }

    @Override
    public int getY() {
        return yPos;
    }

    public char getValue() {
        return value;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        value = 'X';
        setText(Character.toString(value));
    }
}
当按下按钮时,文本确实会发生变化,但当我将鼠标移到按钮外时,文本会恢复到以前的状态

因此,我想您需要阅读apidocs中关于按钮的选定状态和目标状态的内容


具体而言,按钮的状态模型在与鼠标一起使用时的工作方式如下: 按下按钮顶部的鼠标可使模型处于待命和按下状态。只要鼠标保持向下,模型将保持按下状态,即使鼠标移到按钮外。相反,仅当鼠标在按钮边界内保持按下时,模型才处于待命状态(它可以移入或移出按钮,但模型仅在按钮内所花费的部分时间内处于待命状态)。当模型处于待命状态时释放鼠标时,会触发一个按钮,并触发一个ActionEvent,这意味着在鼠标先前按下该按钮(但尚未释放)后,鼠标在按钮上方被释放。释放鼠标后,模型将变得手无寸铁且未按下


不要覆盖
getX
/
getY
,这是一个坏主意。我删除了
getX
/
getY
语句并毫无问题地运行您的代码,我怀疑它们是否是您的问题所在,可能是您代码中的其他地方。此代码对我来说非常好!为了更快地获得更好的帮助,请发布一个or。我一直在挠头,想知道为什么你会这么麻烦,因为OP的代码做了他们想要的,至少是他们已经做过的代码presented@MadProgrammer谢谢我没有提到OP的代码,但提醒了我一些解释。我补充了一句apidoc的话。我还在挠头呢。根据op所说的,当他们将鼠标光标从按钮移开时,它会重置文本,这不是他们想要的,而是你可以做的。我已经试过ops代码,它可以正常工作,所以他们认为问题可能出在其他地方
import java.awt.*;
import javax.swing.*;

public class TileTest {
  private JComponent makeUI() {
    JButton button1 = new JButton("A");
    button1.addChangeListener(e -> {
      JButton b = (JButton) e.getSource();
      ButtonModel m = b.getModel();
      boolean isPressedAndArmed = m.isPressed() && m.isArmed();
      b.setText(isPressedAndArmed ? "X" : "A");
    });

    JButton button2 = new JButton("B");
    button2.addChangeListener(e -> {
      JButton b = (JButton) e.getSource();
      ButtonModel m = b.getModel();
      boolean isPressed = m.isPressed();
      b.setText(isPressed ? "X" : "B");
    });

    JPanel p = new JPanel();
    p.add(button1);
    p.add(button2);
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new TileTest().makeUI());
      f.setSize(320, 240);
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}