Java GUI 桌面應用開發


  前言

  雖然現在已經很少項目會涉及GUI技術,但作為一個合格的Java開發工程師,還是得了解才得

  本文記錄,idea使用JFormDesigner插件進行Java GUI 桌面應用開發

 

  GUI Swing

   圖形化的用戶界面(Graphical User Interface,簡稱GUI),java提供了一套可以輕松構建GUI的工具

  GUI開發包:
    java.awt 包: 主要提供字體/布局管理器
    javax.swing 包:主要提供各種組件(窗口/按鈕/文本框),商業開發常用
    java.awt.event 包:事件處理,后台功能的實現

  Swing組件

    相對於AWT而言Swing包中提供了更多的豐富的、快捷的、強大的GUI組件

    大體上包括以下內容:window頂層容器(窗口)、container中間容器(面板)、component基本組件(按鈕、標簽等)

 

 

  JFormDesigner

  JFormDesigner,高級Swing GUI設計器,支持MigLayout, JGoodies FormLayout, GroupLayout(自由設計),TableLayout和GridBagLayout,這使得它很容易創建專業外觀的表單。

  通俗的講就是使用這個插件進行拖拉布局,快速創建頁面,但是這個插件需要購買許可才能使用

  破解教程:https://www.cnblogs.com/ylkh/p/13858433.html

1、打開注冊機JFormDesigner_Keygen.exe,選擇idea plug-in,里面的可以隨便填
2、點擊Patch,選擇已安裝的插件,生成bak文件(插件位置idea安裝路徑\plugins\FormDesigner\)
3、點擊generate生成JFormDesigner_license.txt文件

 

  代碼編寫

 

  創建圖形頁面,插件會自動同步生成java文件

        

 

 

 

  進行拖拉布局

 

 

 

 

   關鍵點:

  1、頂層容器(JFrame)的Name值要為:this

  2、生成的java文件要繼承 javax.swing.JFrame

public class TestFrame extends javax.swing.JFrame{
    //省略其他代碼...      
}

  3、需要進行單選的RadioButton,要添加同一個Button Group

 

 

   4、defaultCloseOperation要設置成EXIT,點擊X號退出頁面時才會退出程序

 

 

   5、綁定事件,給按鈕添加一個actionPerformed即可

 

 

   6、關閉當前頁面:this.dispose(); //退出當前界面

  7、代碼彈出對話框:JOptionPane.showMessageDialog(null, "恭喜哦,登錄成功!");// Message 對話框

 

  生成的java文件

/*
 * Created by JFormDesigner on Tue Dec 28 15:24:42 CST 2021
 */

package cn.huanzi.qch.view;

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

/**
 * 測試
 */
public class TestFrame extends javax.swing.JFrame{
    public TestFrame() {
        initComponents();

        setVisible(true);// 顯示
        setLocationRelativeTo(null);// JFrame 窗口居中顯示
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(() -> {
            new TestFrame();
            System.out.println("啟動成功!");
        });
    }

    private void SubmitActionPerformed(ActionEvent e) {
        // TODO add your code here
        System.out.println("---------------------------");
        System.out.println("姓名:"+userNameTestField.getText());
        String sex = "";
        if (xyRadioButton.isSelected()) {
            sex = "男";
        } else if (xxRadioButton.isSelected()) {
            sex = "女";
        }else if (yyRadioButton.isSelected()) {
            sex = "不確定";
        }
        System.out.println("性別:"+sex);
        String hobby = "";
        if (singCheckBox.isSelected()) {
            hobby += "唱、";
        }
        if (skipCheckBox.isSelected()) {
            hobby += "跳、";
        }
        if (rapCheckBox.isSelected()) {
            hobby += "rap、";
        }
        System.out.println("愛好:"+hobby);
        System.out.println("自我評價:"+selfTextArea.getText());
    }

    private void initComponents() {
        // JFormDesigner - Component initialization - DO NOT MODIFY  //GEN-BEGIN:initComponents
        label1 = new JLabel();
        userNameTestField = new JTextField();
        label2 = new JLabel();
        label3 = new JLabel();
        submit = new JButton();
        reset = new JButton();
        xxRadioButton = new JRadioButton();
        xyRadioButton = new JRadioButton();
        yyRadioButton = new JRadioButton();
        scrollPane1 = new JScrollPane();
        selfTextArea = new JTextArea();
        label4 = new JLabel();
        label5 = new JLabel();
        singCheckBox = new JCheckBox();
        skipCheckBox = new JCheckBox();
        rapCheckBox = new JCheckBox();

        //======== this ========
        setBackground(Color.gray);
        setTitle("Test GUI");
        setForeground(SystemColor.windowText);
        setMinimumSize(new Dimension(300, 200));
        setResizable(false);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container contentPane = getContentPane();
        contentPane.setLayout(null);

        //---- label1 ----
        label1.setText("\u59d3\u540d\uff1a");
        contentPane.add(label1);
        label1.setBounds(34, 55, 65, 30);
        contentPane.add(userNameTestField);
        userNameTestField.setBounds(119, 55, 200, userNameTestField.getPreferredSize().height);

        //---- label2 ----
        label2.setText("\u6027\u522b\uff1a");
        contentPane.add(label2);
        label2.setBounds(34, 95, 65, 30);

        //---- label3 ----
        label3.setText("\u81ea\u6211\u8bc4\u4ef7\uff1a");
        contentPane.add(label3);
        label3.setBounds(34, 165, 65, 30);

        //---- submit ----
        submit.setText("\u63d0\u4ea4");
        submit.addActionListener(e -> SubmitActionPerformed(e));
        contentPane.add(submit);
        submit.setBounds(new Rectangle(new Point(64, 271), submit.getPreferredSize()));

        //---- reset ----
        reset.setText("\u91cd\u7f6e");
        contentPane.add(reset);
        reset.setBounds(new Rectangle(new Point(219, 271), reset.getPreferredSize()));

        //---- xxRadioButton ----
        xxRadioButton.setText("\u5973");
        contentPane.add(xxRadioButton);
        xxRadioButton.setBounds(new Rectangle(new Point(184, 100), xxRadioButton.getPreferredSize()));

        //---- xyRadioButton ----
        xyRadioButton.setText("\u7537");
        contentPane.add(xyRadioButton);
        xyRadioButton.setBounds(new Rectangle(new Point(129, 100), xyRadioButton.getPreferredSize()));

        //---- yyRadioButton ----
        yyRadioButton.setText("\u4e0d\u786e\u5b9a");
        contentPane.add(yyRadioButton);
        yyRadioButton.setBounds(new Rectangle(new Point(239, 100), yyRadioButton.getPreferredSize()));

        //======== scrollPane1 ========
        {
            scrollPane1.setViewportView(selfTextArea);
        }
        contentPane.add(scrollPane1);
        scrollPane1.setBounds(117, 165, 202, 71);

        //---- label4 ----
        label4.setText("\u6d4b\u8bd5\u8868\u5355");
        label4.setFont(label4.getFont().deriveFont(22f));
        contentPane.add(label4);
        label4.setBounds(124, 0, 100, 45);

        //---- label5 ----
        label5.setText("\u7231\u597d\uff1a");
        contentPane.add(label5);
        label5.setBounds(34, 130, 65, 30);

        //---- singCheckBox ----
        singCheckBox.setText("\u5531");
        contentPane.add(singCheckBox);
        singCheckBox.setBounds(new Rectangle(new Point(129, 135), singCheckBox.getPreferredSize()));

        //---- skipCheckBox ----
        skipCheckBox.setText("\u8df3");
        contentPane.add(skipCheckBox);
        skipCheckBox.setBounds(new Rectangle(new Point(184, 135), skipCheckBox.getPreferredSize()));

        //---- rapCheckBox ----
        rapCheckBox.setText("rap");
        contentPane.add(rapCheckBox);
        rapCheckBox.setBounds(239, 135, 50, rapCheckBox.getPreferredSize().height);

        {
            // compute preferred size
            Dimension preferredSize = new Dimension();
            for(int i = 0; i < contentPane.getComponentCount(); i++) {
                Rectangle bounds = contentPane.getComponent(i).getBounds();
                preferredSize.width = Math.max(bounds.x + bounds.width, preferredSize.width);
                preferredSize.height = Math.max(bounds.y + bounds.height, preferredSize.height);
            }
            Insets insets = contentPane.getInsets();
            preferredSize.width += insets.right;
            preferredSize.height += insets.bottom;
            contentPane.setMinimumSize(preferredSize);
            contentPane.setPreferredSize(preferredSize);
        }
        setSize(400, 365);
        setLocationRelativeTo(null);

        //---- buttonGroup2 ----
        ButtonGroup buttonGroup2 = new ButtonGroup();
        buttonGroup2.add(xxRadioButton);
        buttonGroup2.add(xyRadioButton);
        buttonGroup2.add(yyRadioButton);
        // JFormDesigner - End of component initialization  //GEN-END:initComponents
    }

    // JFormDesigner - Variables declaration - DO NOT MODIFY  //GEN-BEGIN:variables
    private JLabel label1;
    private JTextField userNameTestField;
    private JLabel label2;
    private JLabel label3;
    private JButton submit;
    private JButton reset;
    private JRadioButton xxRadioButton;
    private JRadioButton xyRadioButton;
    private JRadioButton yyRadioButton;
    private JScrollPane scrollPane1;
    private JTextArea selfTextArea;
    private JLabel label4;
    private JLabel label5;
    private JCheckBox singCheckBox;
    private JCheckBox skipCheckBox;
    private JCheckBox rapCheckBox;
    // JFormDesigner - End of variables declaration  //GEN-END:variables
}

 

  效果演示

 

 

 

  后記

  掌握了基本操作后,下面分享我在大學時期做的單機版五子棋、以及java課程實訓作品:圖書管理系統

 

  JavaFX

  2022-01-27更新

  JavaFX是一個強大的圖形和多媒體處理工具包集合,它允許開發者來設計、創建、測試、調試和部署富客戶端程序,並且和Java一樣跨平台。JavaFX比Swing更簡單、更強大!

  中文文檔:http://www.javafxchina.net/blog/docs/

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class MyApp extends Application {
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);
        Scene scene =  new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

 

 

 

  單機版五子棋

   猛戳:Java GUI 單機版五子棋

 

 

 

  圖書管理系統

  數據庫用mysql,GUI圖形化頁面實現用戶登錄后對圖書進行CRUD操作

  登錄頁面

 

 

 

  圖書管理

 

 

 

 

  圖書類別管理

 

 

 

 

 

 

   關於我們

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM