按下时更改JButton的文本

时间:2017-10-30 05:39:10

标签: 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 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));
    }
}

1 个答案:

答案 0 :(得分:-1)

  

按下按钮时文本会发生变化,但当我将鼠标移到按钮外时,文本会恢复到之前的状态

因此,我猜你需要阅读有关所选状态和目标按钮状态的apidocs。

  

ButtonModel (Java Platform SE 8 )
  具体来说,当与鼠标一起使用时,按钮的状态模型的工作方式如下:   将鼠标按在按钮顶部可使模型同时进行布防和按下。只要鼠标保持向下,即使鼠标移动到按钮外,模型也会保持按下状态。相反,模型仅在鼠标按下按钮的范围内时被布防(它可以移入或移出按钮,但模型仅在按钮内花费的时间内被布防​​)。当模型处于布防状态时释放鼠标时会触发一个按钮,并触发一个ActionEvent - 这意味着在鼠标先前按下该按钮(并且尚未释放)之后将其释放到按钮顶部。鼠标释放后,模型将变为非武装和未按下状态。

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);
    });
  }
}