当前位置: 首页 > 知识库问答 >
问题:

Java-更改JLabel的图标不起作用

宗翔宇
2023-03-14

我正在尝试更改一个JLabel的图标(背景),但我有一个问题,图标没有更新。每当我尝试lblstatusimg.seticon(新的ImageIcon(brix_updater_module.class.getResource(“/resources/fail.png”));更改main方法中的JLabel时,编译器首先抱怨变量lblstatusimg不存在,所以我将它从JFrame初始化方法移到了类级变量。在此之后,Eclipse抱怨我试图从静态上下文引用一个非静态方法,因此我将lblstatusimg设置为静态的。这使得程序可以编译,但是图标并没有在任何时候改变。

由于很难理解我的问题,这里提供了一个Eclipse工作区的下载链接,演示了我的问题。当你第一次打开它的时候,你会注意到它有一些问题。他们是故意留在那里的,让你更容易看到我的困难所在。如果Eclipse要求您将所讨论的项设置为静态的,那么只需这样做,然后运行程序即可。您会注意到,它并没有像它应该做的那样更改标签图标。

由于不是所有人都有Eclipse,下面是工作区的全部代码。

import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;

import java.awt.Font;

import javax.swing.SwingConstants;

import java.awt.Window.Type;
import java.io.BufferedOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Timer;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.ImageIcon;
import javax.swing.JButton;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;


public class StackOverflow_Image_Resource_Demo {

    private JFrame frmUpdate;
    JLabel lblStatusImg = new JLabel("");
    JButton btnUpdateComplete = new JButton("OK");

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    StackOverflow_Image_Resource_Demo window = new StackOverflow_Image_Resource_Demo();
                    window.frmUpdate.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        try {
            lblStatusImg.setIcon(new ImageIcon(StackOverflow_Image_Resource_Demo.class.getResource("success.png")));
            btnUpdateComplete.setVisible(true);
        }
        catch(Exception e)
        {
            Component frame = null;
            lblStatusImg.setIcon(new ImageIcon(StackOverflow_Image_Resource_Demo.class.getResource("/resources/fail.png")));
            JOptionPane.showMessageDialog(frame, "Update Failed", "Update Failed", JOptionPane.ERROR_MESSAGE);
            System.exit(1);
        }
    }

    /**
     * Create the application.
     */
    public StackOverflow_Image_Resource_Demo() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frmUpdate = new JFrame();
        frmUpdate.setType(Type.UTILITY);
        frmUpdate.setTitle("StackOverflow Image Resource Issue Demo");
        frmUpdate.setBounds(100, 100, 450, 300);
        frmUpdate.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmUpdate.getContentPane().setLayout(null);

        //JLabel lblStatusImg = new JLabel(""); - Commented out when I made lblStatusImg class level.
        lblStatusImg.setIcon(new ImageIcon(StackOverflow_Image_Resource_Demo.class.getResource("/resources/updating.gif")));
        lblStatusImg.setBounds(10, 22, 414, 97);
        frmUpdate.getContentPane().add(lblStatusImg);

        //JButton btnUpdateComplete = new JButton("OK"); - Commented out when I made btnUpdateComplete class level.
        btnUpdateComplete.setVisible(false);
        btnUpdateComplete.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent arg0) {
                System.exit(1);
            }
        });
        btnUpdateComplete.setBounds(170, 179, 89, 23);
        frmUpdate.getContentPane().add(btnUpdateComplete);
    }
}

这是我的一个更新版本的代码,它更新了映像,但在完成其他所有操作之前不会完全加载UI。

import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;

import java.awt.Font;

import javax.swing.SwingConstants;

import java.awt.Window.Type;
import java.io.BufferedOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Timer;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.ImageIcon;
import javax.swing.JButton;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;


public class StackOverflow_Image_Resource_Demo {

    private JFrame frmUpdate;
    JLabel lblStatusImg = new JLabel("");
    JButton btnUpdateComplete = new JButton("OK");

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    StackOverflow_Image_Resource_Demo window = new StackOverflow_Image_Resource_Demo();

尝试{lblstatusimg.seticon(新建ImageIcon(stackoverflow_image_resource_demo.class.getResource(“success.png”)));BtnUpdateComplete.SetVisible(true);}catch(异常e){Component frame=Null;lblstatusimg.seticon(新建ImageIcon(stackoverflow_image_resource_demo.class.getResource(“/resources/fail.png”));}catch(异常e){e.PrintStackTrace();}}});}

    /**
     * Create the application.
     */
    public StackOverflow_Image_Resource_Demo() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frmUpdate = new JFrame();
        frmUpdate.setType(Type.UTILITY);
        frmUpdate.setTitle("StackOverflow Image Resource Issue Demo");
        frmUpdate.setBounds(100, 100, 450, 300);
        frmUpdate.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmUpdate.getContentPane().setLayout(null);

        //JLabel lblStatusImg = new JLabel(""); - Commented out when I made lblStatusImg class level.
        lblStatusImg.setIcon(new ImageIcon(StackOverflow_Image_Resource_Demo.class.getResource("/resources/updating.gif")));
        lblStatusImg.setBounds(10, 22, 414, 97);
        frmUpdate.getContentPane().add(lblStatusImg);

        //JButton btnUpdateComplete = new JButton("OK"); - Commented out when I made btnUpdateComplete class level.
        btnUpdateComplete.setVisible(false);
        btnUpdateComplete.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent arg0) {
                System.exit(1);
            }
        });
        btnUpdateComplete.setBounds(170, 179, 89, 23);
        frmUpdate.getContentPane().add(btnUpdateComplete);
    }
}

共有1个答案

宋耀
2023-03-14

有两件事来找。第一个是,正如您所说,您试图从静态上下文引用一个非静态变量。

第二个是,你似乎不明白线程是如何工作的……

基本上,main通常在“main”线程中执行(当由JVM执行时)。

        EventQueue.invokeLater(new Runnable() {
            public void run() {

你应该做的是...

  1. 将“状态”更改更改为runnable上下文中。
  2. 提供setstatus方法,该方法能够根据需要根据提供状态更改标签和UI内容

例如...

public static final int SUCCESS = 0;
public static final int FAIL = 0;

//...

public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    StackOverflow_Image_Resource_Demo window = new StackOverflow_Image_Resource_Demo();
                    // This e
                    window.frmUpdate.setVisible(true);

                    window.setStatus(StackOverflow_Image_Resource_Demo.SUCCESS);
                } catch (Exception e) {
                    e.printStackTrace();
                    Component frame = null;
                    window.setStatus(StackOverflow_Image_Resource_Demo.FAIL);
                    JOptionPane.showMessageDialog(frame, "Update Failed", "Update Failed", JOptionPane.ERROR_MESSAGE);
                    window.dispose();
                }
            }
        });
    }
 类似资料:
  • 问题内容: 我有一个称为Keys.java的按钮类,它将按钮面板返回到名为Control.java的类。我在Control.java中有一个JLabel,但是我想做的是在按下按钮时更改JLabel。您将如何去做? 我试过在Keys.java中设置一个字符串,该字符串根据按钮而变化,然后将JLabel的文本设置为等于该字符串,但似乎不起作用。 关于如何实现这一点的任何想法? 问题答案: 可能是您更新

  • 我想在切换项目时切换到底部导航视图的图标。 我有浅蓝色图标和深蓝色图标的选定项目。我正在为每个导航项目使用选择器drawable,但我看到下面这样的图像,灰色为非活动图像,蓝色为活动图像 这是我的代码 bottom_nav_menu 家 和选择器 计划程序选择器 设置选择器 收藏夹选择器 首页选择器 活动代码 我做错了什么?请帮助。。。 编辑:我正在使用以下绘图工具 在此处输入链接描述 在此处输入

  • 问题内容: 这是我编写的代码: 问题答案: 那是正确的。布局管理器负责根据布局管理器的规则设置组件的位置。因此,在您的情况下,FlowLayout将覆盖组件的位置。 绝对不要对组件的位置进行硬编码。如果有人使用的分辨率小于1024 X 768怎么办?该组件将永远不会显示。 您也不应设置组件的大小。每个组件都有一个首选的大小。对于带有图像的标签,首选尺寸将是图像的尺寸。 阅读布局管理器,并使用适当的

  • 问题内容: 我一直在尝试为我的Roguelike游戏添加一个JLabel。不幸的是,它似乎不起作用。到目前为止,这是我的代码: 我已经阅读了一些其他问题的解决方案,并且只需将JLabel添加到另一个解决方案中就可以完成。它不按这里的预期工作,为什么? PS:我不想为我的JPanel使用JLayeredPane。 问题答案: 不要使用组件(即JLabels)创建游戏环境。相反,您可以绘制所有游戏对象

  • 我想用折叠的collapsingToolbar加载一个片段(即以非展开的形式)。当我在不改变appbarLayout布局参数的情况下设置collapsingToolbar的标题时,标题设置正确,我可以看到标题。 问题是,我还需要更改appBarLayout布局参数,以防止collapsingToolbar扩展(即,我希望它看起来和行为像这个特定片段的常规非折叠工具栏)。但是,这样做会使标题不再显示

  • 问题内容: 我目前正在为我的应用程序实现主题支持,其中一部分是更改操作栏应用程序图标。选择“ Holo Light”时,我想使用深色图标。除了设置动作栏应用程序图标的部分以外,其他所有操作均通过该方法完成。我要使用的代码是: 我得到的错误是“这里没有这样的参考”。应该如何正确完成? 顺便说一句,我是那么没有动作吧Sherlock的东西。 问题答案: 您将操作栏扔在那里。返回的实例,然后您需要调用该