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 中提到的错误一直出现,但在我编译我的应用程序。
删除并再次创建组件似乎没有帮助。
答案 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+
文件夹,请将其一并删除,然后再次使缓存失效。
现在您可以在调色板中创建您的自定义组件,一切正常。
希望这对您有所帮助。