【问题标题】:JLabel icon's color only changes when the .setText() is calledJLabel 图标的颜色仅在调用 .setText() 时发生变化
【发布时间】:2021-06-27 20:27:49
【问题描述】:

我将Ikonli Packs 用于我的元素图标并将其添加到JLabel 工作正常。

我想实现悬停功能,但是当我这样做时,什么都没有发生除非我尝试调用我的JLabel.setText() 方法。

我认为可能必须要有文本才能检测光标,但 JLabel 最初没有文本,但它仍然可以检测到它,但正如我所提到的,如果我没有 @ 987654329@也一样,图标颜色不会改变。

这里和其他网站上有很多关于如何为标签/按钮/等实现悬停的示例,但它们都具有一种形状或形式的文本。

还有this example 悬停在图像上,但再次更改文本,而不是图像本身。

MyForm.java 文件中的元素已通过 Swing Palette 添加。)

MyForm.java

package bruh;

import com.formdev.flatlaf.FlatDarkLaf;
import org.kordamp.ikonli.materialdesign2.MaterialDesignA;
import org.kordamp.ikonli.swing.FontIcon;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class MyForm extends JFrame {
    private JPanel mainPanel;
    private JLabel myLabel;

    public MyForm(String title) {
        super(title);

        this.setContentPane(mainPanel);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();

        Color mainColor = Color.RED;
        Color hoverColor = Color.WHITE;
        FontIcon icon = FontIcon.of(MaterialDesignA.ACCOUNT);
        icon.setIconSize(10);
        icon.setIconColor(mainColor);
        myLabel.setIcon(icon);

        myLabel.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                icon.setIconColor(hoverColor);
                myLabel.setIcon(icon);
                //myLabel.setText("ENTERED");
            }

            @Override
            public void mouseExited(MouseEvent e) {
                icon.setIconColor(mainColor);
                myLabel.setIcon(icon);
                //myLabel.setText("EXITED");
            }
        });
    }


    public static void main(String[] args) {
        FlatDarkLaf.setup();

        JFrame frame = new MyForm("Hello World");
        frame.setVisible(true);
    }
}

Maven pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>bruh</groupId>
    <artifactId>bruh</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>com.formdev</groupId>
            <artifactId>flatlaf</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.kordamp.ikonli</groupId>
            <artifactId>ikonli-core</artifactId>
            <version>12.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.kordamp.ikonli</groupId>
            <artifactId>ikonli-swing</artifactId>
            <version>12.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.kordamp.ikonli</groupId>
            <artifactId>ikonli-materialdesign2-pack</artifactId>
            <version>12.2.0</version>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
    </properties>
</project>

【问题讨论】:

  • 我建议改用未装饰的按钮。它可以毫不费力地处理图标更改。如果您想继续使用org.kordamp.ikonli.swing.FontIcon,您最好与开发人员联系。
  • “我建议使用未装饰的按钮。它可以轻松处理图标更改。” - 谢谢。我改用了一个按钮,效果很好。

标签: java swing


【解决方案1】:

根据 Andrew Thompson 的建议,我使用了 JButton 而不是 JLabel

package bruh;

import com.formdev.flatlaf.FlatDarkLaf;
import org.kordamp.ikonli.materialdesign2.MaterialDesignA;
import org.kordamp.ikonli.swing.FontIcon;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class MyForm extends JFrame {
    private JPanel mainPanel;
    private JButton myButton;

    public MyForm(String title) {
        super(title);

        this.setContentPane(mainPanel);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();

        Color mainColor = Color.RED;
        Color hoverColor = Color.WHITE;
        FontIcon icon = FontIcon.of(MaterialDesignA.ACCOUNT);
        icon.setIconSize(10);
        icon.setIconColor(mainColor);
        myButton.setIcon(icon);

        // Use these 2 lines to remove the decoration.
        myButton.setBorderPainted(false);
        myButton.setContentAreaFilled(false);

        myButton.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                icon.setIconColor(hoverColor);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                icon.setIconColor(mainColor);
            }
        });
    }


    public static void main(String[] args) {
        FlatDarkLaf.setup();

        JFrame frame = new MyForm("Hello World");
        frame.setVisible(true);
    }
}

现在只有图标可见,如我原始帖子中的图片所示。

【讨论】:

  • 另外一个不仅用于根据简短提示解决问题,还用于发布答案。
猜你喜欢
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 2014-09-04
  • 2021-04-10
  • 1970-01-01
  • 2012-08-08
  • 2018-04-04
  • 1970-01-01
相关资源
最近更新 更多