我試圖讓充當一個按鈕,就是當你按下它,你按下一個鍵變爲文本的JLabel。當我將其中一個類添加到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
你的預期行爲是什麼?你觀察到的行爲是什麼?請給我們一個完整的描述。 –
請參閱編輯以回答。 –