ボタンとして機能するJLabelを作成しようとしています。押すと、次に押すキーがテキストになります。クラスの1つをJPanelに追加すると、正常に動作します。しかし、追加した場合、最初のものだけが追加されます。これはクラスです:Java KeyListenerは静的であるような変数を扱います
package foo;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class LabelButton extends JLabel implements MouseListener, KeyListener{
String text = "";
boolean editMode = false;
public LabelButton(){
setHorizontalAlignment(SwingConstants.CENTER);
setVerticalTextPosition(JLabel.CENTER);
addMouseListener(this);
addKeyListener(this);
setFocusable(true);
}
public LabelButton(String text){
setHorizontalAlignment(SwingConstants.CENTER);
setVerticalTextPosition(JLabel.CENTER);
addMouseListener(this);
addKeyListener(this);
setFocusable(true);
this.text = text;
}
public void paintComponent(Graphics g){
if(!editMode){
g.setColor(new Color(210,210,210));
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(new Color(140,140,140));
g.drawRect(0, 0, getWidth()-1, getHeight()-1);
FontMetrics metrics = g.getFontMetrics(g.getFont());
Rectangle textrect = new Rectangle(1,1,getWidth()+2,getHeight()-1);
int textx = (textrect.width - metrics.stringWidth(text))/2;
int texty = ((textrect.height - metrics.getHeight())/2) + metrics.getAscent();
g.setColor(new Color(40,40,40));
g.drawString(text, textx, texty);
}else{
g.setColor(new Color(160,160,160));
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(new Color(210,210,210));
g.drawRect(0, 0, getWidth()-1, getHeight()-1);
FontMetrics metrics = g.getFontMetrics(g.getFont());
Rectangle textrect = new Rectangle(1,1,getWidth()+2,getHeight()-1);
int textx = (textrect.width - metrics.stringWidth("..."))/2;
int texty = ((textrect.height - metrics.getHeight())/2) + metrics.getAscent();
g.setColor(new Color(40,40,40));
g.drawString("...", textx, texty);
}
}
public void mouseClicked(MouseEvent e) {
if(e.getButton() == 1){
editMode = !editMode;
System.out.println(text);
repaint();
}
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {
editMode = false;
repaint();
}
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {
System.out.println(text);
if(editMode){
text = (String.valueOf(e.getKeyChar()).toUpperCase());
System.out.println(String.valueOf(e.getKeyChar()).toUpperCase());
editMode = false;
repaint();
}
}
public void keyReleased(KeyEvent e) {}
}
私は何が間違っている、と私は助けが必要です。ありがとう!
サイドノート:コードに重複が多くありますので、最小限に抑えることを目指してください。あなたのコンストラクタとペイントメソッドを見て、あなたは実際のロジックよりもずっと多くのコードを持っています。 – Dici
あなたの期待される行動は何ですか?観察された行動は何ですか?これらについての完全な説明をしてください。 –
編集を参照して回答してください。 –