簡體   English   中英

在JButton OnclickListener中編輯JLabel文本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM