開發(fā)工具
傳統(tǒng)套件IDEA+UI Designer。
UI Designer是一個(gè)idea插件,可以幫助我們通過拖拽控件的方式快速開發(fā)swing界面,因此我們首先要保證idea啟用了該插件。一般情況下,安裝好idea都是自帶了該插件,并且正常啟用的。
設(shè)置
第一步:設(shè)置將GUI生成到Java源代碼
第二步:添加生成代碼時(shí),所需要的一些依賴
<dependency>
<groupId>com.intellij</groupId>
<artifactId>forms_rt</artifactId>
<version>7.0.3</version>
</dependency>
實(shí)戰(zhàn)示例
第一步 創(chuàng)建GUI窗體
第二步:組件JPanel起一個(gè)字段名
這個(gè)很重要,否者在后面生成main時(shí)會(huì)報(bào)錯(cuò),無法生成main方法。
注意布局選擇,默認(rèn)GridLayoutManager.
第三步:拖拽組件畫UI
每個(gè)組件都要設(shè)置屬性名稱。
可以在編輯框和拖拽框中去定義組件的位置和大小。
第四步:給組件加上事件監(jiān)聽
在組件上1處,右鍵然后選擇創(chuàng)建監(jiān)聽器。然后選擇具體的監(jiān)聽器即可。
生成如下代碼:
public MainPanel() {
query.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 這里可以自定義邏輯
// 獲取輸入框內(nèi)容
String keywordText = keyword.getText();
System.out.println(keywordText);
// 輸出到 msg
msg.setText(keywordText);
}
});
}
此時(shí)整體代碼如下:
public class MainPanel {
private JPanel mainPanel;
private JLabel lable;
private JTextField keyword;
private JButton query;
private JTextArea msg;
private JLabel tt;
public MainPanel() {
query.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 獲取輸入框內(nèi)容
String keywordText = keyword.getText();
System.out.println(keywordText);
// 輸出到 msg
msg.setText(keywordText);
}
});
}
}
第五步:生成main方法
在類名稱上右鍵選擇生成或者Alt+Insert
生成代碼如下:
public static void main(String[] args) {
JFrame frame = new JFrame("MainPanel");
frame.setContentPane(new MainPanel().mainPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
第六步:編譯運(yùn)行
運(yùn)行main方法,(idea自動(dòng))生成GUI對(duì)應(yīng)源碼。
重點(diǎn):不要修改自動(dòng)生成的源碼。
因?yàn)槊看尉幾g都會(huì)覆蓋原來生成的源碼,之前的修改就沒了。
自定義組件
UI Designer可以自定義UI組件,例如同意按鈕,拒絕按鈕等,參見**高級(jí)擴(kuò)展 **- 自定義組件。
使用場景為自定義的UI組件類和其他第三方擴(kuò)展UI組件類SwingX,也可以放到UI Designer中去拖拽。
以添加MenuBar組件舉例,默認(rèn)可拖拽列表中沒有該組件。
可拖拽列表中就會(huì)多出個(gè)我們自定義的組件JMenuBar
常用組件
Swing 是 Java 為圖形界面應(yīng)用開發(fā)提供的一組工具包,是 Java 基礎(chǔ)類的一部分。
Swing 包含了構(gòu)建圖形界面(GUI)的各種組件,如: 窗口、標(biāo)簽、按鈕、文本框等。
Swing 提供了許多比 AWT 更好的屏幕顯示元素,使用純 Java 實(shí)現(xiàn),能夠更好的兼容跨平臺(tái)運(yùn)行。
為了和 AWT 組件區(qū)分,Swing 組件在javax.swing.*包下,類名均以 J 開頭,例如: JFrame、JLabel、JButton等。
組件按照不同的功能,可分為 頂層容器、中間容器、基本組件。一個(gè)簡單窗口的組成,如下層級(jí)結(jié)構(gòu)所示:
- 頂層容器
- 菜單欄
- 中間容器
- 基本組件
- 基本組件
- 頂層容器 屬于窗口類組件,繼承自java.awt.Window;頂層容器屬于窗口類組件,可以獨(dú)立顯示,一個(gè)圖形界面至少需要一個(gè)窗口;
- 中間容器 和 基本組件 繼承自javax.swing.JComponent;中間容器充當(dāng)基本組件的載體,不可獨(dú)立顯示。中間容器可以添加若干基本組件(也可以嵌套添加中間容器),對(duì)容器內(nèi)的組件進(jìn)行管理,類似于給各種復(fù)雜的組件進(jìn)行分組管理。最頂層的一個(gè)中間容器必須依托在頂層容器(窗口)內(nèi)。
- 基本組件是直接實(shí)現(xiàn)人機(jī)交互的組件。
總覽
類別 | 組件 | 描述 |
---|---|---|
頂層組件(窗口) | JFrame | 一個(gè)普通的窗口(絕大多數(shù) Swing 圖形界面程序使用 JFrame 作為頂層容器) |
JDialog | 對(duì)話框 | |
中間容器(面板) | JPanel (相當(dāng)于div) | 一般輕量級(jí)面板容器組件(作為JFrame中間容器) |
JScrollPane | 帶滾動(dòng)條的,可以水平和垂直滾動(dòng)的面板組件 | |
JSplitPane | 分隔面板 | |
JTabbedPane | 選項(xiàng)卡面板 | |
JLayeredPane | 層級(jí)面板 | |
中間容器(特殊 菜單欄) | JMenuBar | 菜單欄 |
JToolBar | 工具欄 | |
JPopupMenu | 彈窗菜單 | |
JInternalFrame | 內(nèi)部窗口 | |
基本組件(按鈕,標(biāo)簽等) | JLabel | 標(biāo)簽 |
JButton | 按鈕 | |
JTextField | 文本框 | |
JTextArea | 文本區(qū)域 | |
JPasswordField | 密碼框 | |
JComboBox | 下拉列表框 | |
JRadioButton | 單選按鈕 | |
JCheckBox | 復(fù)選框 | |
JToggleButton | 開關(guān)按鈕 | |
JList | 列表 | |
JProgressBar | 進(jìn)度條 | |
JSlider | 滑塊 | |
選取器組件 | JFileChooser | 文件選擇器 |
JColorChooser | 顏色選取器 | |
其他組件 | JTable | 表格 |
JTree | 樹 |
JFrame
- 設(shè)置JFrame左上角的名稱
frame.setTitle("laker");
- 動(dòng)態(tài)的設(shè)置主體框架為固定的寬和高
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
if (screenSize.getWidth() > 1280) {
frame.setPreferredSize(new Dimension(1280, 800));
} else if (screenSize.getWidth() > 1024) {
frame.setPreferredSize(new Dimension(1200, 768));
} else {
frame.setPreferredSize(new Dimension(960, 640));
}
frame.pack();
- 靜態(tài)的設(shè)置固定的寬和高
frame.setSize(800, 400);
- 設(shè)置JFrame在屏幕中間啟動(dòng)
frame.setLocationRelativeTo(null);
- 設(shè)置窗體的icon圖標(biāo)
//找到了,當(dāng)前目錄就是本項(xiàng)目的根路徑
frame.setIconImage(new ImageIcon("src/main/java/cn/zuo/myres/icon/seal.png").getImage());
- 設(shè)置窗口的x,y位置,窗口大小x,y.
frame.setBounds(600, 300, 500, 400);
- 設(shè)置默認(rèn)的關(guān)閉窗口
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- 添加panel面板到容器
frame.add(panel)
- 添加面板到主窗口,布局在北面
frame.getContentPane().add(panel, BorderLayout.NORTH);
添加可滾動(dòng)面板到主窗口,布局在中間
flame.getContentPane().add(scrollPane, BorderLayout.CENTER);
- 這個(gè)最好放在最后,不然視圖會(huì)看不到
frame.setVisible(true);
- 確保一個(gè)漂亮的外觀風(fēng)格
frame.setDefaultLookAndFeelDecorated(true);
JDialog
JOptionPane是一個(gè)用于顯示標(biāo)準(zhǔn)對(duì)話框的類,常用于與JDialog結(jié)合使用。常用的方法包括:
-
showMessageDialog(Component parentComponent, Object message)
: 顯示一個(gè)包含消息的對(duì)話框。 -
showInputDialog(Component parentComponent, Object message)
: 顯示一個(gè)包含輸入框的對(duì)話框,用于獲取用戶輸入。 -
showConfirmDialog(Component parentComponent, Object message)
: 顯示一個(gè)包含確認(rèn)按鈕的對(duì)話框,用于獲取用戶確認(rèn)。
這種不常用的方式。
-
JDialog()
: 創(chuàng)建一個(gè)默認(rèn)的、模態(tài)的JDialog。 -
JDialog(Dialog owner, String title, boolean modal)
: 創(chuàng)建一個(gè)帶有指定所有者、標(biāo)題和模態(tài)屬性的JDialog。 -
setDefaultCloseOperation(int operation)
: 設(shè)置關(guān)閉對(duì)話框時(shí)的操作。 -
setVisible(boolean b)
: 設(shè)置對(duì)話框是否可見。 -
setResizable(boolean resizable)
: 設(shè)置對(duì)話框是否可調(diào)整大小。 -
setSize(int width, int height)
: 設(shè)置對(duì)話框的大小。 -
setLocationRelativeTo(Component c)
: 將對(duì)話框定位到指定組件的中心。 -
setLayout(LayoutManager mgr)
: 設(shè)置對(duì)話框的布局管理器。 -
setTitle(String title)
: 設(shè)置對(duì)話框的標(biāo)題。 -
setContentPane(Container contentPane)
: 設(shè)置對(duì)話框的內(nèi)容面板。
JPanel
JPanel panel = new JPanel(); // 創(chuàng)建面板容器
panel.add(button); // 添加按鈕到面板
JScrollPane scrollPane = new JScrollPane(); // 創(chuàng)建可滾動(dòng)面板
scrollPane.setViewportView(textArea); // 設(shè)置面板內(nèi)容
// 彈出提示框到panel容器
JOptionPane.showMessageDialog(panel3, "沒有選中任何文件", "提示", JOptionPane.WARNING_MESSAGE);
Layout布局
無論上面哪種組件,都可以設(shè)置布局,比如 frame.setLayout(new BorderLayOut())
或者 panel.setLayout(new FlowLayout())
再或是 button.setLayout(GridLayout)
。常用布局如下:
所屬類包 | 布局管理器名稱 | 說明 |
---|---|---|
空布局 | ||
Java.awt | BorderLayout(邊界布局) | 容器劃分為東、西、南、北、中五個(gè)區(qū)域,每個(gè)區(qū)域只能放置一個(gè)組件。 |
Java.awt | GridLayout(網(wǎng)格布局) | 容器的空間劃分成M×N列的網(wǎng)格區(qū)域, 每個(gè)區(qū)域只能放置一個(gè)組件。其中col與row可以手動(dòng)設(shè)置 |
Java.awt | FlowLayout(流式布局) | 組件按照加入的先后順序按照設(shè)置的對(duì)齊方式從左向右排列,一行排滿到下一行開始繼續(xù)排列 |
Java.awt | GridBagLayout(網(wǎng)格包布局) | GridLayout的升級(jí)版,組件仍然是按照行、列放置,但是每個(gè)組件可以占據(jù)多個(gè)網(wǎng)格 |
Java.awt | CardLayout(卡片布局) | 如同一疊牌,每個(gè)牌對(duì)應(yīng)一個(gè)組件,但每次只能顯示其中的一張牌。適用于在一個(gè)空間中防止多個(gè)組件的情況 |
Java.swing | BoxLayout(箱式布局) | 允許在容器中縱向或者橫向防止多個(gè)控件 |
Java.swing | SprigLayout(彈簧布局) | 根據(jù)一組約束條件放置控件 |
高級(jí)擴(kuò)展
擴(kuò)展皮膚
FlatLaf
FlatLaf是用于JavaSwing 桌面應(yīng)用程序的現(xiàn)代開源跨平臺(tái)外觀。
- https://github.com/JFormDesigner/FlatLaf
第一步 首先Maven中引入依賴庫:
<dependency>
<groupId>com.formdev</groupId>
<artifactId>flatlaf</artifactId>
<version>3.0</version>
</dependency>
如果想切換IntelliJ主題還可以添加以下包
<dependency>
<groupId>com.formdev</groupId>
<artifactId>flatlaf-intellij-themes</artifactId>
<version>3.0</version>
</dependency>
flatlaf-swingx
flatlaf-intellij-themes
flatlaf-extras
第二步 在啟動(dòng)JFrame之前先執(zhí)行FlatLightLaf.setup()
// 亮色
FlatLightLaf.setup();
// 暗色
FlatDarkLaf.setup();
// 基于 FlatLaf Light)看起來像 IntelliJ IDEA 2019.2+ 中的 IntelliJ 主題
FlatIntelliJLaf.setup();
// (基于 FlatLaf Dark)看起來像來自 IntelliJ IDEA 2019.2+
FlatDarculaLaf.setup();
FlatMacLightLaf.setup();
FlatMacDarkLaf.setup();
UIManager.put("TextComponent.arc", 5);
UIManager.put("Component.focusWidth", 1);
UIManager.put("Component.innerFocusWidth", 1);
UIManager.put("Button.innerFocusWidth", 1);
UIManager.put("TitlePane.unifiedBackground", true);
UIManager.put("TitlePane.menuBarEmbedded", false);
// 設(shè)置字體,設(shè)置字體抗鋸齒
System.setProperty("awt.useSystemAAFontSettings", "on");
System.setProperty("swing.aatext", "true");
Font fontUIResource = new Font("宋體", Font.PLAIN, 22);
for (Enumeration keys = UIManager.getDefaults().keys(); keys.hasMoreElements(); ) {
Object key = keys.nextElement();
Object value = UIManager.get(key);
if (value instanceof FontUIResource) {
UIManager.put(key, fontUIResource);
}
}
UIManager.put("defaultFont", fontUIResource);
weblaf
- https://github.com/mgarin/weblaf
第一步 添加依賴
<dependency>
<groupId>com.weblookandfeel</groupId>
<artifactId>weblaf-ui</artifactId>
<version>1.2.13</version>
</dependency>
第二步 在啟動(dòng)JFrame之前先執(zhí)行WebLookAndFeel.install ()
public class QuickStart
{
public static void main ( final String[] args )
{
// You should always work with UI inside Event Dispatch Thread (EDT)
// That includes installing L&F, creating any Swing components etc.
SwingUtilities.invokeLater ( new Runnable ()
{
@Override
public void run ()
{
// Install WebLaF as application LaF
WebLookAndFeel.install ();
// You can also specify preferred skin right-away
// WebLookAndFeel.install ( WebDarkSkin.class );
// You can also do that in one of the old-fashioned ways
// UIManager.setLookAndFeel ( new WebLookAndFeel () );
// UIManager.setLookAndFeel ( "com.alee.laf.WebLookAndFeel" );
// UIManager.setLookAndFeel ( WebLookAndFeel.class.getCanonicalName () );
// You can also configure other WebLaF managers as you like now
// StyleManager
// SettingsManager
// LanguageManager
// ...
// Initialize your application once you're done setting everything up
// JFrame frame = ...
// You can also use Web* components to get access to some extended WebLaF features
// WebFrame frame = ...
}
} );
}
}
擴(kuò)展組件
自定義組件
第一步 新建LakerButton
public class LakerButton extends JButton {
public LakerButton() {
super();
super.putClientProperty(FlatClientProperties.STYLE, "focusedBackground: #263238;borderWidth:0;background: #08f; foreground: #fff;disabledBackground: #9e9e9e;disabledText:#fff;arc:10;");
}
}
第二步 在拖拽列表中增加自定義的組件
第三步 在具體的Panel生成的代碼中加入如下:
// 有自定義組件的時(shí)候 必須要加
private void createUIComponents() {
lakerButton1 = new LakerButton();
}
SwingX
- https://github.com/arotenberg/swingx
打包部署
打包成可執(zhí)行Jar
第一步 pom.xml添加打包插件并修改mainClass為自己的main所在類
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<!--包含文件夾以及子文件夾下所有資源-->
<include>**/*.*</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- main類 -->
<mainClass>com.laker.swing.Bootstrap</mainClass>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
第二步 打包完成后執(zhí)行
缺點(diǎn):運(yùn)行環(huán)境需要自己去安裝jdk。
java -jar xxx.jar
打包成成品
JAR包打包為EXE 常見的將java項(xiàng)目打包為exe的工具有好幾種,例如:exe4j,install4j,launch4j,JavaPackager
,還有java14之后的Jpackage
等。
JavaPackager是jdk1.8自帶的一個(gè)打包工具,可以生成各個(gè)系統(tǒng)的安裝包,是最簡單方便的,可定制性也足夠,該插件能夠支持桌面系統(tǒng)windows,linux,mac,能隨著項(xiàng)目迭代而簡單的通過打包命令來得到最新的exe程序,可謂是相當(dāng)方便了。
- https://github.com/fvarrui/JavaPackager
- windows 打包成exe執(zhí)行包無需任何依賴;
- windows 打包成exe安裝包的時(shí)候才需要;
- innosetup-5.6.0.exe(windows下Java8支持6版本以下的,不要下載6及其6以上的版本,否則無法打包成功)
- 我沒有安裝這個(gè)也可以打包成exe,但是不是安裝包是執(zhí)行包。
- https://jrsoftware.org/isinfo.php
- windows 打包msi安裝包的時(shí)候才需要;
-
Wix Toolset(打包成msi必須下載,沒有下載
javapackager
會(huì)提示缺少wix) - https://wixtoolset.org/
-
Wix Toolset(打包成msi必須下載,沒有下載
- 生成本機(jī)安裝包(在linux下生成deb,在windows下生成exe,在mac下生成dkg)
注意
- 注意
- 注意
安裝Inno Setup后必須要添加環(huán)境變量,保證cmd可以直接用到命令 iscc
-
環(huán)境變量Path中必須增加 C:\Program Files (x86)\Inno Setup 6
-
java 11必須使用6.x版本。
添加如下到pom.xml
:
<plugin>
<groupId>io.github.fvarrui</groupId>
<artifactId>javapackager</artifactId>
<version>{latest.version}</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>package</goal>
</goals>
<configuration>
<!-- mandatory -->
<mainClass>path.to.your.mainClass</mainClass>
<!-- optional -->
// 是否包含jre,這個(gè)需要選true,打包后將會(huì)包含可運(yùn)行的jre在exe的同目錄下
<bundleJre>true|false</bundleJre>
// 是否生成msi安裝軟件
<generateInstaller>true|false</generateInstaller>
// 是否必須管理員權(quán)限運(yùn)行程序
<administratorRequired>true|false</administratorRequired>
// 打包的目標(biāo)平臺(tái),auto|linux|mac|windows
<platform>auto|linux|mac|windows</platform>
<additionalResources>
<additionalResource>file path</additionalResource>
<additionalResource>folder path</additionalResource>
<additionalResource>...</additionalResource>
</additionalResources>
<linuxConfig>...</linuxConfig>
<macConfig>...</macConfig>
<winConfig>...</winConfig>
[...]
</configuration>
</execution>
</executions>
</plugin>
項(xiàng)目示例
<build>
<plugins>
<plugin>
<groupId>io.github.fvarrui</groupId>
<artifactId>javapackager</artifactId>
<version>1.6.7</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>package</goal>
</goals>
<configuration>
<mainClass>com.laker.swing.Bootstrap</mainClass>
<!-- 打包的名稱 laker.exe -->
<name>laker</name>
<!-- 在應(yīng)用程序中嵌入定制的 JRE。 -->
<bundleJre>true</bundleJre>
<!-- 為應(yīng)用程序生成安裝程序。-->
<generateInstaller>false</generateInstaller>
<!-- 應(yīng)用程序?qū)⒁怨芾韱T身份運(yùn)行(具有提升的權(quán)限)。 -->
<administratorRequired>false</administratorRequired>
<platform>windows</platform>
<createZipball>true</createZipball>
<!-- <winConfig>-->
<!-- <headerType>gui</headerType>-->
<!-- <generateMsi>true</generateMsi>-->
<!-- </winConfig>-->
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
打包結(jié)果:
自定義圖標(biāo)打包
ico在線生成
- https://www.logosc.cn/logo/favicon?s=laker
- https://convertico.com/favicon/
默認(rèn)打包后使用的圖標(biāo),如下目錄:
laker
- src
- assets
- windows
- ${name}.ico // 例如配置的laker.exe,這里的name就是laker
- mac
- ${name}.icns
- linux
- ${name}.png
pom.xml
如果未指定 icon ,它將默認(rèn)為所有平臺(tái)使用 icon。文章來源:http://www.zghlxwxcb.cn/news/detail-437522.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-437522.html
參考
- https://blog.csdn.net/justry_deng/article/details/121869629
- https://blog.csdn.net/weixin_43935927/article/details/109003074
- https://www.cnblogs.com/sandeepin/p/flatlaf-swing-ui-theme.html
- https://gitee.com/dromara/RedisFront/blob/master/build.gradle.kts
- https://blog.csdn.net/weixin_43444930/article/details/117855310
到了這里,關(guān)于Swing開發(fā)教程從入門到實(shí)踐(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!