【问题标题】:Why isn't my JLabel updating on each click?为什么我的 JLabel 没有在每次点击时更新?
【发布时间】:2019-10-29 22:35:26
【问题描述】:

基本上,我试图做到这一点,因此每次单击 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();
    }
}

【问题讨论】:

  • 你永远不会修改标签的值
  • @MadProgrammer 我添加了“JLabel();”我认为应该更新它。
  • 与您的问题无关,但您应该更改JLabelmethod 的名称。它不符合java naming convention 并且具有误导性,因为它也是一个类的名称
  • @jhamon 哦,是的,当然,这对我来说更重要,当我发帖时我没有注意到这一点。抱歉,我会改的。
  • 你不要打电话给PanelConfig()。代码中缺少部分? java naming convention, Why is it frowned upon to use a null layout in Swing?

标签: java swing jpanel jlabel mouselistener


【解决方案1】:

所以,您的“基本”问题是,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。详情请见Laying Out Components Within a Container

更新...

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

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

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

改为使用

frame.getContentPane().addMouseListener(this);

【讨论】:

  • 我在主类中调用 JPanel。 java public class Main { public static void main(String args[]) { Franels windows = new Franels(); windows.FrameConfig(900, 900); windows.PanelConfig(); windows.LabelConfig(); } } 其他信息。之后我立即更改了它,对此感到抱歉。我一定会花时间学习 Layout Manager API;我只是输入 null 因为一个网站有。
  • 恭喜您没有为人们提供足够的信息来诊断您的问题:/
  • 讽刺会拯救我的理智,提供正确诊断您的问题并阻止我们疯狂猜测所需的所有信息,这会拯救您;)
  • 我听取了人们的建议和信息,并加以应用。我可以犯错误,但如果我花时间纠正错误,然后你开始谈论没有足够的信息。我不确定还有什么可以推断的。我不会强迫任何人帮助我或让他们不断检查我更新的内容,但如果他们决定他们愿意提供帮助并且不尝试获取 OP 可能提供的更新信息,我宁愿你不要“帮助” “完全没有。关于你的评论和解释的更新版本,谢谢,我现在试试。
  • 关于更新,现在完美运行!我对 Franels 的新实例和当前实例有点困惑;你知道这个新实例在哪里吗?不管怎样,谢谢。
【解决方案2】:

更改金额后更新 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);
    }
}

【讨论】:

  • 我之前试过这个,Panel里面的0就没有了。
  • 谢谢,我会记下您的编辑并尝试使用它并理解每一点。
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
相关资源
最近更新 更多