首页 > 解决方案 > 为什么我的 JLabel 没有在每次点击时更新?

问题描述

基本上,我试图做到这一点,所以每次单击 JFrame 中的某个位置时,JLabel 都会加 1。问题是,如果我要打印出数量的值,它会增加,但实际的 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();
    }
}

标签: javaswingjpaneljlabelmouselistener

解决方案


所以,你的“基本”问题是,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. 我会避免使用方法直接初始化组件。相反,他们应该创建自己的对象实例并返回它。如果需要,您可以将它们分配给其他变量,但它们本身的方法应该是自包含的
  2. 你的方法命名是......难以阅读。考虑使用getXxx代替(即,,getPanelgetLabel或更有意义的东西
  3. null布局只是核心中的一个完整的痛苦。您最好花时间学习如何使用布局管理器 API。有关更多详细信息,请参阅在容器中布置组件

更新...

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

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

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

相反,使用

frame.getContentPane().addMouseListener(this);

推荐阅读