目前,基于CFD软件的二次开发是很多企业内部提升工作效率的重要手段。一般的商用CFD软件往往是通用软件,比如我们熟知的Fluent和STAR-CCM+等。这种软件的通用性很强,就是说很多场景、很多专业都可以使用这种软件,但是对于某一个专业来讲,它日常的应用往往局限于某一领域,此时软件通用性反而意义不大。这些专业的应用场景更需要专一的仿真工作模板或流程,以提高日常工作的效率。
不过,庆幸的是,这些通用化的商用软件一般都保留了二次开发的接口。你只需掌握一些特定的API接口,就可以开发出属于自己的定制软件。
在CFD软件二次开发的过程中,不可避免地要进行用户交互界面GUI的制作,可以说这是二次开发的基本功,应该做到可以徒手撸代码的水平,尤其在筑基期要大量练习纯手工写代码,不要过度依赖IDE软件的辅助功能。
今天,基于Java Swing 带大家练习两个GUI开发的简单案例。
注:本文基于IDEA软件编写GUI代码。
在GUI界面开发前,搞清楚Java的事件处理机制非常重要。下图给出了事件处理流程。
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+中运行上述代码。