如何创建具有从 AbstractButton 继承的不同默认值的 JButton?

时间:2021-06-27 12:13:44

标签: java swing intellij-idea

JButton 扩展了 AbstractButton,它具有这些默认变量。

// Display properties
private boolean    paintBorder             = true;
private boolean    contentAreaFilled         = true;

我想说通过调色板创建的 JButton 将它们作为 false

我尝试创建一个新类并从 AbstractButton 复制代码(它将被一种新类型的 JButton 扩展)并且只更改了这些值,但其中使用的一些方法是私有的,不能从不同的包访问。

即使我可以从不同的包访问它们,我也需要创建一个新的自定义 Swing 组件 - 有没有简单的方法可以做到这一点?

我为什么要这样做?我将创建许多按钮,其中这些值将为 false,如果可能,我希望避免必须通过各自的方法为每个按钮设置它们。

编辑 1:

IconButton.java - 正如 Abra

所建议的
import javax.swing.*;

public class IconButton extends JButton {

    public IconButton() {
        setContentAreaFilled(false);
        setBorderPainted(false);

    }
}

通过下面的代码以编程方式添加按钮是可行的,但是尝试通过将其拖放到 JPanel (Card Layout) 中的方式通过调色板添加它是行不通的。没有任何反应,没有错误或任何事情。

MyForm.java

import components.IconButton;
import components.CustomIkon;
import com.formdev.flatlaf.FlatDarkLaf;
import org.kordamp.ikonli.materialdesign2.MaterialDesignA;

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

public class MyForm extends JFrame {

    private JPanel mainPanel;
    private JButton normalButton;
    private JPanel testPanel;

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

        CustomIkon icon = CustomIkon.of(MaterialDesignA.ACCOUNT);

        normalButton.setIcon(icon);
        normalButton.setBorderPainted(false);
        normalButton.setContentAreaFilled(false);

        IconButton iconButton = new IconButton();
        iconButton.setIcon(icon);
        testPanel.add(iconButton);

        this.setContentPane(mainPanel);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.pack();
    }


    public static void main(String[] args) {

        FlatDarkLaf.setup();

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

}

我找到了一个 similar problem,但那里的答案没有帮助。项目使用的 JDK 和字节码版本在 IntelliJ 中是相同的(在本例中为版本 16)。

我正在按照接受的答案下方的建议调查日志。

编辑 2:

我在应用程序运行后在日志中发现了这个错误:

2021-06-27 18:39:12,264 [2711861]  ERROR - llij.ide.plugins.PluginManager - IconButton has been compiled by a more recent version of the Java Runtime (class file version 60.0), this version of the Java Runtime only recognizes class file versions up to 55.0 
2021-06-27 18:39:12,267 [2711864]  ERROR - llij.ide.plugins.PluginManager - IntelliJ IDEA 2021.1.2  Build #IC-211.7442.40 
2021-06-27 18:39:12,268 [2711865]  ERROR - llij.ide.plugins.PluginManager - JDK: 11.0.11; VM: Dynamic Code Evolution 64-Bit Server VM; Vendor: JetBrains s.r.o.

据我所知,这意味着我正在使用比我运行时更新的版本来编译应用程序。不过,我不明白这与无法将调色板中的按钮添加到表单有什么关系。

我会继续调查。

编辑 3:

项目结构

项目

a) 项目 SDK:openjdk-16

b) 项目语言级别:SDK 默认(16 - 记录、模式、本地枚举和接口)

模块

a) 来源 -> 语言级别:16 - 记录、模式、本地枚举和接口

b) 依赖项 -> 模块 SDK:项目 SDK openjdk-16

SDKs -> openjdk-16

设置

Java 编译器:

a) 使用编译器:Javac

b) 项目字节码版本:与语言级别相同

c) 每模块字节码版本 -> 目标字节码版本:16

Java 版本:

[username]:~/.jdks/openjdk-16.0.1/bin$ ./java -version
openjdk version "16.0.1" 2021-04-20
OpenJDK Runtime Environment (build 16.0.1+9-24)
OpenJDK 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)

编辑 4:

正如一些answers here中的建议,我去检查了 Maven 使用的 JDK(文件 -> 设置 -> 构建、执行、部署 -> 构建工具 -> Maven -> 导入 -> JDK for导入器),它是 JRE 版本 11。我将其更改为使用 Project SDK

之后,我使缓存无效(文件 -> 使缓存无效),删除了 target 文件夹并再次运行我的应用程序。

Edit 2 中提到的日志中的错误已经消失。

不幸的是,我仍然无法将调色板中的血腥 IconButton 添加到 JPanel

编辑 5:

似乎每次我尝试将 IconButton 从调色板拖放到 JPanel 时,Edit 2 中提到的错误一直出现,但在我编译我的应用程序。

删除并再次创建组件似乎没有帮助。

1 个答案:

答案 0 :(得分:0)

(使用 IntelliJ)

按照 Abra 的建议,创建一个扩展 JButton 的自定义按钮。

import javax.swing.*;

public class CustomButton extends JButton {

    public CustomButton() {
        setContentAreaFilled(false);
        setBorderPainted(false);
    }
}

之后,转到调色板并添加您的组件:

右键单击 -> 添加组 -> 右键单击​​组 -> 将组件添加到面板 -> 选择 Class 单选按钮 -> 单击 [...] 按钮并选择您的 { {1}} 类 -> 单击 CustomButton -> 选中 OK(可选 - 当您将其添加到表单时,它将在表单的类中创建一个变量,将其绑定到组件)。< /p>

如果它让您在之后添加组件但出现 Create binding automatically 错误,请尝试按 Ctrl+Shift+F9(它会选择表单中的所有组件并重新编译他们)。

如果您重构类,也可能会出现此错误。您可能需要删除 Form contains components with Custom Create option but no createUIComponents() method 文件夹(如果它存在)和/或使缓存无效(文件 -> 使缓存无效)。

如果您的组件出现在调色板中,但是当您将其拖放到表单中时没有任何反应(即未添加它),请单击“帮助”->“在文件管理器中显示日志”。

打开它并检查您是否收到类似于以下内容的错误:

target

如果是这样的话,感谢 Vish,您必须降级到 Java Runtime 识别的版本或升级它(我不知道如何升级它,所以在我的情况下,我降级了).

(确保在继续之前从您创建的调色板中删除自定义组件,以防万一。)

最简单的降级方法是去 File -> Project Settings -> Project -> Project SDK -> 点击下拉菜单 -> Add SDK -> Download JDK -> Select version (这里是 11)并选择一个供应商(我选择了 AdoptOpenJDK(HotSpot))。

然后,下载并点击应用按钮。之后,转到我的编辑 3 中提到的所有项目结构设置位置,并确保它们都分配了相同的版本。

这也包括 Maven/Gradle。就我而言,我使用的是前者,因此我必须将 Custom Button has been compiled by a more recent version of the Java Runtime (class file version 60.0), this version of the Java Runtime only recognizes class file versions up to 55.0 文件中的 properties 从 16 更改为 11。

pom.xml

如果您忘记在 <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> /pom.xml 文件中更改它,当您尝试运行您的应用程序时,您可能会收到类似于以下内容的错误:

build.gradle

最后但并非最不重要的一点是,如果您在降级/升级之前忘记从调色板中删除自定义组件,请立即删除。如果您在降级/升级后仍有 By default, the Java language level is set to 5 which is not supported by the current Java version. Update the language level to 6+ 文件夹,请将其一并删除,然后再次使缓存失效。

现在您可以在调色板中创建您的自定义组件,一切正常。

希望这对您有所帮助。

相关问题