[英]Edit JLabel Text in JButton OnclickListener
我是編程的新手,最近我開始使用Java中的JFrame。 我正在創建一個程序,用戶可以使用兩個按鈕在pokedex中滾動。 我有兩個JLabel,分別顯示pokedex編號和pokedex名稱。 我遇到了一個障礙,無法基於在onclick偵聽器中編輯的字符串和整數來更改jlabel文本。 請告訴我我在做什么錯。
package window;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
public class RunWindow extends Canvas implements Runnable{
private static final long serialVersionUID = 1L;
public static final int WIDTH = 800;
public static final int HEIGHT = 600;
public static final int SCALE = 1;
public static final String NAME = "Pokedex";
public int pokedexNum = 1;
public String pokedexName = "Bulbasaur";
private JFrame frame;
private JPanel panel = new JPanel();
private JButton b1;
private JButton b2;
private boolean update = true;
JLabel label;
JLabel label2;
public boolean running = false;
public RunWindow(){
BufferedImage imgUP = null;
do {
switch(pokedexNum){
case 1:
pokedexName = "Bulbasaur";
break;
case 2:
pokedexName = "Ivysaur";
break;
case 3:
pokedexName = "Venisaur";
break;
}
label = new JLabel("Pokemon #"+pokedexNum+"-"+pokedexName);
label2 = new JLabel("#"+pokedexNum);
update = false;
}while (update);
label = new JLabel("Pokemon #"+pokedexNum+"-"+pokedexName);
label2 = new JLabel("#"+pokedexNum);
label.setLocation(50, 50);
frame = new JFrame(NAME);
b1 = new JButton("Up");
b2 = new JButton("Down");
frame.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
frame.setPreferredSize(new Dimension(WIDTH*SCALE,HEIGHT*SCALE));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(this,BorderLayout.CENTER);
frame.setResizable(false);
frame.add(label);
frame.add(label2);
frame.add(panel);
frame.add(b1);
frame.add(b2);
frame.pack();
frame.setVisible(true);
frame.setLocationRelativeTo(null);
b1.setBounds(300, 400, 40, 20);
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(pokedexNum);
if(pokedexNum <= 3){
pokedexNum++;
switch(pokedexNum){
case 1:
pokedexName = "Bulbasaur";
break;
case 2:
pokedexName = "Ivysaur";
break;
case 3:
pokedexName = "Venisaur";
break;
}
label = new JLabel("Pokemon #"+pokedexNum+"-"+pokedexName);
label2 = new JLabel("#"+pokedexNum);
update = false;
System.out.println(pokedexName);
label.setText("Pokemon #"+pokedexNum+"-"+pokedexName);
label2.setText("#"+pokedexNum);
label.setText(label.getText());
}
}
} );
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pokedexNum--;
System.out.println("Down");
}
} );
b2.setBounds(300, 420, 40, 20);
b1.setHorizontalTextPosition(JButton.CENTER);
b1.setVerticalTextPosition(JButton.CENTER);
label.setBounds(300, 50, 200, 24);
label2.setBounds(340,400,80,20);
frame.add( label, BorderLayout.NORTH );
frame.add( panel , BorderLayout.CENTER);
}
public void run() {
}
public synchronized void start(){
running = true;
new Thread(this).start();
}
public void updatePokedex(){
do {
switch(pokedexNum){
case 1:
pokedexName = "Bulbasaur";
break;
case 2:
pokedexName = "Ivysaur";
break;
case 3:
pokedexName = "Venisaur";
break;
}
label = new JLabel("Pokemon #"+pokedexNum+"-"+pokedexName);
label2 = new JLabel("#"+pokedexNum);
update = false;
}while (update);
}
public synchronized void stop(){
running = false;
}
public static void main(String[] args){
new RunWindow().start();
}
}
我沒有詳細介紹您的代碼,但是從我看到的結果來看,您似乎在創建JLabels,這可能是造成此問題的原因,因為最初創建的標簽就是您所創建的標簽添加到您的Swing組件中,並顯示在JFrame中。
您應該重用這些標簽,並簡單地使用它們的setText方法來更改它們顯示的文本。
您已經有2個Label變量,並且只想更改文本,但是每次都創建新標簽:
label = new JLabel("Pokemon #"+pokedexNum+"-"+pokedexName);
相反,您應該這樣做:
label.setText("....");
無論如何,稍后再做幾行。 問題在於,您永遠不會將新創建的標簽添加到框架(在開始時添加它們,但是當您覆蓋“ label”和“ label2”時,它們是NEW標簽,並且您還需要將它們添加到框架中,導致您每次單擊按鈕時都會添加2個標簽)
只需刪除:
label = new JLabel("Pokemon #"+pokedexNum+"-"+pokedexName);
label2 = new JLabel("#"+pokedexNum);
我還建議您不要使用switch語句,而應該使用字符串數組,而只需調用
setText(pokemonNames[pokedexNum]);
這樣,您不需要為不同的pokedex案例使用數百條代碼行。
您可以像這樣輕松地創建String []:
private static String[] pokeNames = new String[]{"","Bulbasaur","Ivysaur"};
我在開始處包含一個空String,以便數組的索引與pokedex中的數字相同(可以說索引從1開始)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.