为什么我的 JLabel 没有在每次点击时更新?

Why isn't my JLabel updating on each click?

基本上,我试图做到这一点,因此每次您单击 JFrame 中的某处时,JLabel 都会加 1。问题是,如果我要打印出 amount 的值,它会增加,但是实际的 JLabel 继续保持不变。

为了尝试解决这个问题,我尝试在您每次单击时更新 JLabel 对象,但这似乎也不起作用。 (写"JLabel();")除此之外,我真的想不出它可能是什么,

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Franels extends MouseAdapter {
    int width, height;
    int amount = 0;

    JFrame frame = new JFrame("Title");
    JPanel panel = new JPanel();
    JButton button = new JButton("Hello");
    JLabel label = new JLabel();

    public void FrameConfig(int width, int height) {
        this.width = width;
        this.height = height;
        frame.setSize(width, height);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setLayout(null);
        frame.setResizable(false);

        frame.add(panel);

        frame.getContentPane().addMouseListener(new Franels());
    }

    public void PanelConfig() {
        panel.setBounds(300, 300, 300, 300);
        panel.setBackground(Color.blue);
        panel.setVisible(true);

        panel.add(label);        
    }

    public void LabelConfig() {
        label.setForeground(Color.red);
        label.setText(String.valueOf(amount));
    }

    public void mouseClicked(MouseEvent e) {
        amount++;
        LabelConfig();
        System.out.println(amount);
    }
}
import javax.swing.*;
import java.awt.*;

public class Main {


    public static void main(String args[]) {
        Franels windows = new Franels();
        windows.FrameConfig(900, 900);
        windows.PanelConfig();
        windows.LabelConfig();
    }
}

更改金额后更新 JLabel 文本,它不会自动执行。

 public void mouseClicked(MouseEvent e) {
      amount++;
      label.setText(String.valueOf(amount));
 }

编辑:正如您所说,上述解决方案对您不起作用,我编写了一个小程序来模拟您正在尝试做的事情。

public class Panel extends JPanel implements MouseListener
{
    JLabel label = new JLabel();
    int amount = 0;

    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setSize(400,400);
        frame.setContentPane(new Panel());
        frame.setVisible(true);
    }

    public Panel()
    {
        addMouseListener(this);
        label.setText(""+amount);
        add(label);
    }

    public void mouseClicked(MouseEvent arg0)
    {
        amount++;
        label.setText(""+amount);
        System.out.println(amount);
    }
}

所以,您的 "basic" 问题是,JPanel() 从未被调用,因此标签永远不会添加到 UI。

public class Franels extends MouseAdapter {

    //...
    JPanel panel = new JPanel();

    // Just want to point out that these method names
    // are poorly chosen
    public void JFrame(int width, int height) {
        //...
        // Thi sis going to give you no end of issues
        frame.setLayout(null);
        //...
        frame.add(panel);
        //...
    }

    // This is never called
    public void JPanel() {
        panel.setBounds(300, 300, 300, 300);
        panel.setBackground(Color.blue);
        panel.setVisible(true);

        panel.add(label);        
    }


    //...
}

你的问题比较大

  1. 我会避免使用方法直接初始化组件。相反,他们应该创建自己的对象实例并 return 它。如果需要,您可以将它们分配给其他变量,但它们本身的方法应该是独立的
  2. 你的方法命名是......难以阅读。考虑改用 getXxx(即 getPanelgetLabel)或更有意义的东西
  3. null 布局完全是核心问题。您最好花时间学习如何使用布局管理器 API。有关详细信息,请参阅 Laying Out Components Within a Container

已更新...

好的,经过更多的挖掘。已更新的 label 实例与屏幕上的 label 实例不同。这需要更多的挖掘,但问题归结为:

frame.getContentPane().addMouseListener(new Franels());

您正在创建 Franels 的新实例,它正在接收鼠标事件并更新其 label 实例,这与屏幕实例不同。

改为使用

frame.getContentPane().addMouseListener(this);