0


Swing开发教程从入门到实践(一)

文章目录

开发工具

传统套件IDEA+UI Designer

UI Designer是一个idea插件,可以帮助我们通过拖拽控件的方式快速开发swing界面,因此我们首先要保证idea启用了该插件。一般情况下,安装好idea都是自带了该插件,并且正常启用的。

设置

第一步:设置将GUI生成到Java源代码

第二步:添加生成代码时,所需要的一些依赖

<dependency><groupId>com.intellij</groupId><artifactId>forms_rt</artifactId><version>7.0.3</version></dependency>

实战示例

第一步 创建GUI窗体

第二步:组件JPanel起一个字段名

这个很重要,否者在后面生成main时会报错,无法生成main方法。

注意布局选择,默认GridLayoutManager.

第三步:拖拽组件画UI

每个组件都要设置属性名称。

可以在编辑框和拖拽框中去定义组件的位置和大小。

第四步:给组件加上事件监听

在组件上1处,右键然后选择创建监听器。然后选择具体的监听器即可。

生成如下代码:

publicMainPanel(){
        query.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvent e){// 这里可以自定义逻辑// 获取输入框内容String keywordText = keyword.getText();System.out.println(keywordText);// 输出到 msg
                msg.setText(keywordText);}});}

此时整体代码如下:

publicclassMainPanel{privateJPanel mainPanel;privateJLabel lable;privateJTextField keyword;privateJButton query;privateJTextArea msg;privateJLabel tt;publicMainPanel(){
        query.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvent e){// 获取输入框内容String keywordText = keyword.getText();System.out.println(keywordText);// 输出到 msg
                msg.setText(keywordText);}});}}

第五步:生成main方法

在类名称上右键选择生成或者Alt+Insert

生成代码如下:

publicstaticvoidmain(String[] args){JFrame frame =newJFrame("MainPanel");
        frame.setContentPane(newMainPanel().mainPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);}

第六步:编译运行

运行main方法,(idea自动)生成GUI对应源码。

重点不要修改自动生成的源码

因为每次编译都会覆盖原来生成的源码,之前的修改就没了。

自定义组件

UI Designer可以自定义UI组件,例如同意按钮,拒绝按钮等,参见**高级扩展 **- 自定义组件

使用场景为自定义的UI组件类和其他第三方扩展UI组件类SwingX,也可以放到UI Designer中去拖拽。

以添加MenuBar组件举例,默认可拖拽列表中没有该组件。

可拖拽列表中就会多出个我们自定义的组件JMenuBar

常用组件

Swing 是 Java 为图形界面应用开发提供的一组工具包,是 Java 基础类的一部分。

Swing 包含了构建图形界面(GUI)的各种组件,如: 窗口、标签、按钮、文本框等。

Swing 提供了许多比 AWT 更好的屏幕显示元素,使用纯 Java 实现,能够更好的兼容跨平台运行。

为了和 AWT 组件区分,Swing 组件在javax.swing.*包下,类名均以 J 开头,例如: JFrame、JLabel、JButton等。

组件按照不同的功能,可分为 顶层容器、中间容器、基本组件。一个简单窗口的组成,如下层级结构所示:

- 顶层容器
    - 菜单栏
    - 中间容器
        - 基本组件
        - 基本组件
  • 顶层容器 属于窗口类组件,继承自java.awt.Window;顶层容器属于窗口类组件,可以独立显示,一个图形界面至少需要一个窗口;
  • 中间容器 和 基本组件 继承自javax.swing.JComponent;中间容器充当基本组件的载体,不可独立显示。中间容器可以添加若干基本组件(也可以嵌套添加中间容器),对容器内的组件进行管理,类似于给各种复杂的组件进行分组管理。最顶层的一个中间容器必须依托在顶层容器(窗口)内。
  • 基本组件是直接实现人机交互的组件。

总览

类别组件描述顶层组件(窗口)JFrame一个普通的窗口(绝大多数 Swing 图形界面程序使用 JFrame 作为顶层容器)JDialog对话框中间容器(面板)JPanel (相当于div)一般轻量级面板容器组件(作为JFrame中间容器)JScrollPane带滚动条的,可以水平和垂直滚动的面板组件JSplitPane分隔面板JTabbedPane选项卡面板JLayeredPane层级面板中间容器(特殊 菜单栏)JMenuBar菜单栏JToolBar工具栏JPopupMenu弹窗菜单JInternalFrame内部窗口基本组件(按钮,标签等)JLabel标签JButton按钮JTextField文本框JTextArea文本区域JPasswordField密码框JComboBox下拉列表框JRadioButton单选按钮JCheckBox复选框JToggleButton开关按钮JList列表JProgressBar进度条JSlider滑块选取器组件JFileChooser文件选择器JColorChooser颜色选取器其他组件JTable表格JTree树

JFrame

  • 设置JFrame左上角的名称
frame.setTitle("laker");
  • 动态的设置主体框架为固定的宽和高
Dimension screenSize =Toolkit.getDefaultToolkit().getScreenSize();if(screenSize.getWidth()>1280){
    frame.setPreferredSize(newDimension(1280,800));}elseif(screenSize.getWidth()>1024){
    frame.setPreferredSize(newDimension(1200,768));}else{
    frame.setPreferredSize(newDimension(960,640));}
frame.pack();
  • 静态的设置固定的宽和高
frame.setSize(800,400);
  • 设置JFrame在屏幕中间启动
frame.setLocationRelativeTo(null);
  • 设置窗体的icon图标
//找到了,当前目录就是本项目的根路径
frame.setIconImage(newImageIcon("src/main/java/cn/zuo/myres/icon/seal.png").getImage());
  • 设置窗口的x,y位置,窗口大小x,y.
frame.setBounds(600,300,500,400);
  • 设置默认的关闭窗口
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  • 添加panel面板到容器
frame.add(panel)
  • 添加面板到主窗口,布局在北面
frame.getContentPane().add(panel,BorderLayout.NORTH);
添加可滚动面板到主窗口,布局在中间
flame.getContentPane().add(scrollPane,BorderLayout.CENTER);
  • 这个最好放在最后,不然视图会看不到
frame.setVisible(true);
  • 确保一个漂亮的外观风格
frame.setDefaultLookAndFeelDecorated(true);

JDialog

JOptionPane是一个用于显示标准对话框的类,常用于与JDialog结合使用。常用的方法包括:

  • showMessageDialog(Component parentComponent, Object message): 显示一个包含消息的对话框。
  • showInputDialog(Component parentComponent, Object message): 显示一个包含输入框的对话框,用于获取用户输入。
  • showConfirmDialog(Component parentComponent, Object message): 显示一个包含确认按钮的对话框,用于获取用户确认。

这种不常用的方式。

  • JDialog(): 创建一个默认的、模态的JDialog。
  • JDialog(Dialog owner, String title, boolean modal): 创建一个带有指定所有者、标题和模态属性的JDialog。
  • setDefaultCloseOperation(int operation): 设置关闭对话框时的操作。
  • setVisible(boolean b): 设置对话框是否可见。
  • setResizable(boolean resizable): 设置对话框是否可调整大小。
  • setSize(int width, int height): 设置对话框的大小。
  • setLocationRelativeTo(Component c): 将对话框定位到指定组件的中心。
  • setLayout(LayoutManager mgr): 设置对话框的布局管理器。
  • setTitle(String title): 设置对话框的标题。
  • setContentPane(Container contentPane): 设置对话框的内容面板。

JPanel

JPanel panel =newJPanel();// 创建面板容器
panel.add(button);// 添加按钮到面板JScrollPane scrollPane =newJScrollPane();// 创建可滚动面板
scrollPane.setViewportView(textArea);// 设置面板内容// 弹出提示框到panel容器JOptionPane.showMessageDialog(panel3,"没有选中任何文件","提示",JOptionPane.WARNING_MESSAGE);

Layout布局

无论上面哪种组件,都可以设置布局,比如

frame.setLayout(new BorderLayOut())

或者

panel.setLayout(new FlowLayout())

再或是

button.setLayout(GridLayout)

。常用布局如下:
所属类包布局管理器名称说明空布局Java.awtBorderLayout(边界布局)容器划分为东、西、南、北、中五个区域,每个区域只能放置一个组件。Java.awtGridLayout(网格布局)容器的空间划分成M×N列的网格区域, 每个区域只能放置一个组件。其中col与row可以手动设置Java.awtFlowLayout(流式布局)组件按照加入的先后顺序按照设置的对齐方式从左向右排列,一行排满到下一行开始继续排列Java.awtGridBagLayout(网格包布局)GridLayout的升级版,组件仍然是按照行、列放置,但是每个组件可以占据多个网格Java.awtCardLayout(卡片布局)如同一叠牌,每个牌对应一个组件,但每次只能显示其中的一张牌。适用于在一个空间中防止多个组件的情况Java.swingBoxLayout(箱式布局)允许在容器中纵向或者横向防止多个控件Java.swingSprigLayout(弹簧布局)根据一组约束条件放置控件

高级扩展

扩展皮肤

FlatLaf

FlatLaf是用于JavaSwing 桌面应用程序的现代开源跨平台外观。

第一步 首先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

第二步 在启动JFrame之前先执行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);// 设置字体,设置字体抗锯齿System.setProperty("awt.useSystemAAFontSettings","on");System.setProperty("swing.aatext","true");Font fontUIResource =newFont("宋体",Font.PLAIN,22);for(Enumeration keys =UIManager.getDefaults().keys(); keys.hasMoreElements();){Object key = keys.nextElement();Object value =UIManager.get(key);if(value instanceofFontUIResource){UIManager.put(key, fontUIResource);}}UIManager.put("defaultFont", fontUIResource);

weblaf

第一步 添加依赖

<dependency><groupId>com.weblookandfeel</groupId><artifactId>weblaf-ui</artifactId><version>1.2.13</version></dependency>

第二步 在启动JFrame之前先执行WebLookAndFeel.install ()

publicclassQuickStart{publicstaticvoid main (finalString[] args ){// You should always work with UI inside Event Dispatch Thread (EDT)// That includes installing L&F, creating any Swing components etc.SwingUtilities.invokeLater (newRunnable(){@Overridepublicvoid run (){// Install WebLaF as application LaFWebLookAndFeel.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 = ...}});}}

扩展组件

自定义组件

第一步 新建LakerButton

publicclassLakerButtonextendsJButton{publicLakerButton(){super();super.putClientProperty(FlatClientProperties.STYLE,"focusedBackground: #263238;borderWidth:0;background: #08f; foreground: #fff;disabledBackground: #9e9e9e;disabledText:#fff;arc:10;");}}

第二步 在拖拽列表中增加自定义的组件

第三步 在具体的Panel生成的代码中加入如下:

// 有自定义组件的时候 必须要加privatevoidcreateUIComponents(){
    lakerButton1 =newLakerButton();}

SwingX

打包部署

打包成可执行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><transformerimplementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/><transformerimplementation="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>

第二步 打包完成后执行

缺点:运行环境需要自己去安装jdk。

java -jar xxx.jar

打包成成品

JAR包打包为EXE 常见的将java项目打包为exe的工具有好几种,例如:

exe4j,install4j,launch4j,JavaPackager

,还有java14之后的

Jpackage

等。

JavaPackager是jdk1.8自带的一个打包工具,可以生成各个系统的安装包,是最简单方便的,可定制性也足够,该插件能够支持桌面系统windows,linux,mac,能随着项目迭代而简单的通过打包命令来得到最新的exe程序,可谓是相当方便了。

  • https://github.com/fvarrui/JavaPackager
  • windows 打包成exe执行包无需任何依赖;
  • windows 打包成exe安装包的时候才需要; - innosetup-5.6.0.exe(windows下Java8支持6版本以下的,不要下载6及其6以上的版本,否则无法打包成功)- 我没有安装这个也可以打包成exe,但是不是安装包是执行包。- https://jrsoftware.org/isinfo.php
  • windows 打包msi安装包的时候才需要; - Wix Toolset(打包成msi必须下载,没有下载javapackager会提示缺少wix)- https://wixtoolset.org/
  • 生成本机安装包(在linux下生成deb,在windows下生成exe,在mac下生成dkg)

**

注意

** - **

注意

** - **

注意

**

安装Inno Setup后必须要添加环境变量,保证cmd可以直接用到命令 iscc

  • 环境变量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,这个需要选true,打包后将会包含可运行的jre在exe的同目录下
                <bundleJre>true|false</bundleJre>
                // 是否生成msi安装软件
                <generateInstaller>true|false</generateInstaller>
                // 是否必须管理员权限运行程序
                <administratorRequired>true|false</administratorRequired>
                // 打包的目标平台,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>

项目示例

<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><!-- 在应用程序中嵌入定制的 JRE。 --><bundleJre>true</bundleJre><!-- 为应用程序生成安装程序。--><generateInstaller>false</generateInstaller><!-- 应用程序将以管理员身份运行(具有提升的权限)。 --><administratorRequired>false</administratorRequired><platform>windows</platform><createZipball>true</createZipball><!--                            <winConfig>--><!--                                <headerType>gui</headerType>--><!--                                <generateMsi>true</generateMsi>--><!--                            </winConfig>--></configuration></execution></executions></plugin></plugins></build>

打包结果:

自定义图标打包

ico在线生成

默认打包后使用的图标,如下目录:

laker
    - src
    - assets
        - windows
            - ${name}.ico // 例如配置的laker.exe,这里的name就是laker
        - mac
            - ${name}.icns
        - linux
            - ${name}.png 
    pom.xml

如果未指定 icon ,它将默认为所有平台使用 icon。

参考

标签: java intellij-idea ui

本文转载自: https://blog.csdn.net/abu935009066/article/details/129584449
版权归原作者 lakernote 所有, 如有侵权,请联系我们删除。

“Swing开发教程从入门到实践(一)”的评论:

还没有评论