首页/文章/ 详情

CFD二次开发必不可少的GUI练习

1年前浏览7068

目前,基于CFD软件的二次开发是很多企业内部提升工作效率的重要手段。一般的商用CFD软件往往是通用软件,比如我们熟知的Fluent和STAR-CCM+等。这种软件的通用性很强,就是说很多场景、很多专业都可以使用这种软件,但是对于某一个专业来讲,它日常的应用往往局限于某一领域,此时软件通用性反而意义不大。这些专业的应用场景更需要专一的仿真工作模板或流程,以提高日常工作的效率。

不过,庆幸的是,这些通用化的商用软件一般都保留了二次开发的接口。你只需掌握一些特定的API接口,就可以开发出属于自己的定制软件。

在CFD软件二次开发的过程中,不可避免地要进行用户交互界面GUI的制作,可以说这是二次开发的基本功,应该做到可以徒手撸代码的水平,尤其在筑基期要大量练习纯手工写代码,不要过度依赖IDE软件的辅助功能。

今天,基于Java Swing 带大家练习两个GUI开发的简单案例。

注:本文基于IDEA软件编写GUI代码。

事件处理机制

在GUI界面开发前,搞清楚Java的事件处理机制非常重要。下图给出了事件处理流程。

  • 事件源:事件发生的场所,通常就是各个组件,例如按钮、窗口、菜单等。
  • 事件:事件封装了GUI组件上发生的特定事情(通常就是一次用户操作)。如果程序需要获得GUI组件上所发生事件的相关信息,都通过Event对象来取得。
  • 事件监 听 器:负责监听事件源所发生的事件,并对各种事件做出响应处理。
  • 事件处理器:其实就是定义在事件监 听 器中的方法。
 

Java的事件处理机制是一种委派式事件处理方式:普通组件(事件源)将事件的处理工作委托给特定的对象(事件监 听 器);当该事件源发生指定的事件时,就通知所委托的事件监 听 器,由事件监 听 器来处理这个事件。

《疯狂Java讲义第三版》书中给了一个形象的比喻,这里 分享给大家:

委派式事件处理方式明显“抄袭”了人类社会的分工协作,例如某个单位发生了火灾,该单位通常不会自己处理该事件,而是将该事件委派给消防局(事件监 听 器);如果发生了打架斗殴事件,则委派给公安局(事件监 听 器)处理;而消防局、公安局也会同时监听多个单位的火灾、大家斗殴事件。这种委派式监 听 器方式将事件源和事件监 听 器分离,从而提供更好的程序模型,有利于提高程序的可维护性。

案例

案例一

案例一比较简单,主要利用Swing创建一个消息发送窗口,并给文本框绑定快捷键Ctrl+Enter

package my;

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

public class SendMsg {
   JFrame jf = new JFrame("测试");
   JTextArea jta = new JTextArea(5,30);
   JButton jb = new JButton("发送");
   JTextField jtf = new JTextField(15);
   public void init(){
       //给jf窗口添加一个文本区域jta
       jf.add(jta);

       //创建一个JPanel容器
       JPanel jp = new JPanel();

       //容器jp中添加文本框jtf
       jp.add(jtf);

       //容器jp中添加按键
       jp.add(jb);

       //将jp容器添加到jf窗口中,并应用SOUTH布局
       jf.add(jp, BorderLayout.SOUTH);

       //创建事件监 听 器,发送消息的Action,Action是ActionListener的子接口
       Action sendMsg = new AbstractAction() {
           @Override
           public void actionPerformed(ActionEvent e) {
              jta.append(jtf.getText() + "\n");
              jtf.setText("");
           }
       };
       //注册事件监 听 器
       jb.addActionListener(sendMsg);

       //将Ctrl+Enter键和“send”关联
       jtf.getInputMap().put(KeyStroke.getKeyStroke('\n', InputEvent.CTRL_MASK),"send");

       //将“send”和sendMsg Action关联
       jtf.getActionMap().put("send",sendMsg);
       jf.pack();
       jf.setVisible(true);
   }
   //创建主方法
   public static void main(String[] args){
       new SendMsg().init();
   }
}

下面是代码的界面效果。

 

案例二

第二个案例我们练习下Swing中的特殊容器JSplitPane,下面的程序将简单示范JSplitPane的用法。

package my;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.util.EventListener;

public class SplitPane {
   Book[] books = new Book[]{
           new Book("CFD日志", new ImageIcon("picture/头像_仿真秀.jpg")
                   , "分享干货,记录成长")
           , new Book("一键三连", new ImageIcon("picture/喵.jpg")
           , "感谢你的支持!")
   };
   JFrame jf = new JFrame("测试");
   JList<Book> bookList = new JList<>(books);

   JLabel bookCover = new JLabel();
   JTextArea bookDesc = new JTextArea();
   public void init(){
       //为三个组件设置最佳大小
       bookList.setPreferredSize(new Dimension(150,300));
       bookCover.setPreferredSize(new Dimension(300,150));
       bookDesc.setPreferredSize(new Dimension(300,150));
       
       //为下拉列表添加事件监 听 器
       bookList.addListSelectionListener(new ListSelectionListener() {
           @Override
           public void valueChanged(ListSelectionEvent e) {
               Book book = (Book) bookList.getSelectedValue();
               bookCover.setIcon(book.getIco());
               bookDesc.setText(book.getDesc());
           }

       });
       //创建一个垂直的分割面板
       //将bookCover放在上面,将bookDesc放在下面,支持连续布局
       JSplitPane left = new JSplitPane(JSplitPane.VERTICAL_SPLIT,true,bookCover,new JScrollPane(bookDesc));
       //打开“一触即展”特性
       left.setOneTouchExpandable(true);
       //下面代码设置分割条大小
       //left.setDividerSize(50);
       //设置该分割面板根据所包含组件的最佳大小来调整布局
       left.resetToPreferredSizes();
       //创建一个水平的分割面板
       //将left组件放在左边,将bookList组件放在右边
       JSplitPane content = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,left,bookList);
       jf.add(content);
       jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       jf.pack();
       jf.setVisible(true);

   }
   public static void main(String[] args){
       new SplitPane().init();
   }
}

注意:上面的代码需要调用一个Book类,代码具体如下。

package my;

import javax.swing.*;

public class Book {
   private String title;
   private ImageIcon image;
   private String instruction;

   public Book(String title, ImageIcon image, String instruction) {
       this.title = title;
       this.image = image;
       this.instruction = instruction;
   }
   public ImageIcon getIco(){

       return image;
   }

   public String toString(){
       return title;
   }

   public String getDesc(){
       return instruction;
   }
}

运行主程序可得到如下图所示窗口。

 

今天就到这里,后面更新一篇文章,教你如何在STAR-CCM+中运行上述代码。



来源:CFD日志
Fluent二次开发通用消防
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-03-28
最近编辑:1年前
CFD日志
硕士 | CFD工程师 CFD仿真、风机设计、二次开发
获赞 239粉丝 2096文章 39课程 8
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈