[英]Changing the text of JButton when pressed
我想在按下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。
ButtonModel(Java平台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);
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.