idea的Java窗体可视化工具Swing UI Designer的简单使用(一)

发布时间 2023-11-23 22:12:51作者: szmtjs10

0、问题总结

Warning:java: 源值1.5已过时, 将在未来所有发行版中删除:

 

 

 Error:java: Compilation failed: internal java compiler error:

 

 

 

1、窗体的初使用

创建GUI Form

 

 

 

 

 

 注意使用这个关闭模式:

 

 使用 jFrame.pack(); 替换 jFrame.setSize(800,400); 。。。可以很好的包裹住界面。。

 

设置窗体的icon图标:

绝对路径:

 jFrame.setIconImage(new ImageIcon("D:\\daima\\allmyjava\\moreUtils\\src\\main\\java\\cn\\zuo\\myres\\icon\\seal.png").getImage());

 

相对路径:注意根路径的位置。。。

 jFrame.setIconImage(new ImageIcon("src/main/java/cn/zuo/myres/icon/seal.png").getImage()); //找到了,当前目录就是本项目的根路径

 

2、主窗体的布局选择

选择表单布局:

 

  

使用这种布局需要导入依赖:

 

<!-- https://mvnrepository.com/artifact/com.jgoodies/forms -->
<dependency>
 <groupId>com.jgoodies</groupId>
 <artifactId>forms</artifactId>
 <version>1.2.1</version>
</dependency>

表格位置的移动:

 

 调节表单的每部分的大小:

 

 

 对行列的添加与删除:

 

  

使用preview查看窗体:

 

 

 

 

 设置preview时的长度:只对展示时有用,不对真实运行时有用。

 

 3、对字体的设置

字体的选择:

 

 

 

4、关于标签Label

设置LabelFor:(。。感觉没有效果啊。。。)

 

 

 

5、文本域的添加

文本域外边距的设置

 

 

 

调节文本域大小:

 

 

 

设置文本域的不可编辑:

 

 

 

文本域内容的预先定义:

 

 

 

6、对按钮的添加

使按钮占满区域:

 

 

 

7、事件

7.1、按钮事件

 

 

 

 

 

 

 

8、菜单栏

添加manubar组件:

 

 

  

 

 

菜单的manu和manuItem手动添加:这种只能执行main函数才能看到,使用preview是看不到的。。

 

 

 

9、通过卡片Card布局实现界面切换

不使用可视化的代码:

 

//不使用可视化的Card布局,实现界面切换。。。
public class Test1 extends JFrame implements ActionListener {
    private JPanel jp1;
    private JPanel jp2;
    private JPanel jp3;
    private JButton bt1;
    private JButton bt2;
    private JButton bt3;
    private JPanel card;
    private CardLayout cl;
    private JMenuBar jmb;
    private JMenu jm;
    private JPanel jpmain;
    public Test1(){
        jmb = new JMenuBar();
        jm = new JMenu("doge");
        jmb.add(jm);
        jpmain = new JPanel(new BorderLayout());
        jpmain.add(jmb,"North");
        bt1 = new JButton("按钮1");
        bt2 = new JButton("按钮2");
        bt3 = new JButton("按钮3");
        bt1.addActionListener(this);
        bt2.addActionListener(this);
        bt3.addActionListener(this);
        jp1= new JPanel();
        jp1.add(bt1);
        jp2 =new JPanel();
        jp2.add(bt2);
        jp3=new JPanel();
        jp3.add(bt3);
        card = new JPanel();
        cl = new CardLayout();
        card.setLayout(cl);
        card.add(jp1);
        card.add(jp2);
        card.add(jp3);
        jpmain.add(card,"Center");
    }
    public static void main(String[]args){
        JFrame jf = new JFrame("界面切换");
        Test1 t = new Test1();
        jf.add(t.jpmain);
        jf.pack();
        jf.setDefaultCloseOperation(3);
        jf.setVisible(true);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==bt1){
            cl.next(card);
        }
        else if(e.getSource()==bt2){
            cl.next(card);
        }
        else if(e.getSource()==bt3){
            cl.first(card);
        }else{
        }
    }
}

 

card的可替换部分使用可视化进行组装,而主要页面(包括菜单栏和替换部分)使用非可视化,手动进行构建。。

 

//主界面
public class Test1 extends JFrame implements ActionListener {
    private JPanel jp1;
    private JPanel jp2;
    private JPanel jp3;
    private JPanel card;//能够替换的部分
    private CardLayout cl;//用来执行替换
    private JMenuBar jmb;
    private JMenu jm;
    private JMenuItem jmi1,jmi2,jmi3;
    private JPanel jpmain;//主页面,包括菜单部分和替换部分
    public Test1(){
        jmb = new JMenuBar();
        jmi1 = new JMenuItem("card1");
        jmi1.addActionListener(this);
        jmi2 = new JMenuItem("card2");
        jmi2.addActionListener(this);
        jmi3 = new JMenuItem("card3");
        jmi3.addActionListener(this);
        jm = new JMenu("doge");
        jm.add(jmi1);
        jm.add(jmi2);
        jm.add(jmi3);
        jmb.add(jm);
        jpmain = new JPanel(new BorderLayout());
        jpmain.add(jmb,"North");

        jp1= new JPanel();
        jp1.add(new Card1().getPanel1());
        jp2 =new JPanel();
        jp2.add(new Card2().getPanel1());
        jp3=new JPanel();
        jp3.add(new Card3().getPanel1());

        card = new JPanel();
        cl = new CardLayout();
        
        card.setLayout(cl);
        card.add("card1",jp1);//要在能替换界面的直接位置添加名字
        card.add("card2",jp2);
        card.add("card3",jp3);
        
        jpmain.add(card,"Center");
    }
    public static void main(String[]args){
        JFrame jf = new JFrame("界面切换");
        Test1 t = new Test1();
        jf.add(t.jpmain);
        jf.pack();
        jf.setDefaultCloseOperation(3);
        jf.setVisible(true);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==jmi1){
            cl.show(card,"card1");//根据名字切换界面
        }
        else if(e.getSource()==jmi2){
            cl.show(card,"card2");
        }
        else if(e.getSource()==jmi3){
            cl.show(card,"card3");
        }else{
        }
    }
}

 

 

 

10、打成可执行jar包

 

 

 

 

 

 

 注:

 

打成完毕,但是界面不完整了。。。

 

原因:原来是使用的主题的问题,使用beautyeye主题就会有界面不完整,暂时还找不到解决方案。但是使用系统默认主题就没问题了,系统主题中nimbus好看一点。。。

 

注:

 

打成完毕,但是icon不显示了。。。

 

暂时还没有解决方法。

 

*、杂

*.1 窗体主题风格的设置

这里是参考此博客写的:https://www.cnblogs.com/clarino/p/8668160.html

 

// Metal风格 (默认)
String lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";
UIManager.setLookAndFee(lookAndFeel);

// Windows风格
String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
UIManager.setLookAndFee(lookAndFeel);  

// Windows Classic风格
String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel";
UIManager.setLookAndFee(lookAndFeel);  

// Motif风格
String lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);

// Mac风格 (需要在相关的操作系统上方可实现)
String lookAndFeel = "com.sun.java.swing.plaf.mac.MacLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);

// GTK风格 (需要在相关的操作系统上方可实现)
String lookAndFeel = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);

// 可跨平台的默认风格
String lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();
UIManager.setLookAndFeel(lookAndFeel);

// 当前系统的风格
String lookAndFeel = UIManager.getSystemLookAndFeelClassName();
UIManager.setLookAndFeel(lookAndFeel);

 

 

########## 优选 ##########

 

Weblaf:非常赞的套件,界面现代、简约。依赖包较少。 有开源也有商业协议,个人最喜欢的皮肤。

https://github.com/mgarin/weblaf

 

PgsLookAndFeel:界面简约现代,Apache2开源协议

http://www.pagosoft.com/projects/pgslookandfeel/

 

Seaglass:蛮美观的UI,界面现代,是基于Java 7自带皮肤Nimbus改进

https://github.com/khuxtable/seaglass/wiki

 

beautyeye:国人开发的UI,界面现代(但是项目打成jar包后,执行,窗体加载有问题)

https://github.com/JackJiang2011/beautyeye

 

1、导入包

 

  2、改变样式(在new出JFrame的地方添加)

 

try
{
org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF();
}
catch(Exception e)
{
//TODO exception
e.printStackTrace();
}

 

3、具体的操作请去github上查看

 

########## 中选 ##########

 

Synthetica:较丰富的UI风格,但对中文字体的支持有问题。一半的皮肤免费,但其中一些较美观的需要商业授权

http://www.javasoft.de/synthetica/themes/

 

Jtattoo:分GPL / LGPL / Apache三种协议,有开源也有商业版,个人较喜欢其中的Luna风格(提供直观显示其各种主题的效果,同时推荐下载其源码学习各种控件的使用方法)

http://www.jtattoo.net/

 

----- 参考附件

 

Insubstantial:substance项目的分支项目

https://github.com/Insubstantial/insubstantial

 

Nimbus:Java SE 6 Update 10以后Oracle内置的皮肤,如果想安全稳定,选它没错了

http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/nimbus.html

 

########## 其他 ##########

 

Quaqua:整的很像MAC OS的界面

http://www.randelshofer.ch/quaqua/index.html

 

Alloy:商业的,感觉一般

http://lookandfeel.incors.com/

 

JGoodies:商业的,感觉更一般

http://www.jgoodies.com/products/swing-suite/

 

 

 

设置自己喜欢的主题:(另一种方式获得)

  

 

 

执行程序时的窗体主题的实现转换功能(×),好像只能执行程序的时候执行一次

 

#、说明

本文只是简单的对Swing UI Designer的使用。

 

 

11、选择文件夹组件


通过按钮来打开窗口,绑定一个事件:

 

 

生成文件选择器窗口:

 

JFileChooser ff = new JFileChooser("d://workplace");
ff.setFileSelectionMode(JFileChooser.FILES_ONLY);//只有文件能选

int result = ff.showDialog(null, "请选择文件");

if(result==JFileChooser.APPROVE_OPTION){
    System.out.println(ff.getSelectedFile().getPath());//获取选择的文件路径
}

 


12、JList的使用


使用JList前,最好套一个JScrollPane(下拉框)

添加列表元素

 

 

添加点击监听

方式一:

list1.addListSelectionListener(new ListSelectionListener() {//添加列表选择监听
    @Override
    public void valueChanged(ListSelectionEvent e) {//值改变监听
        if(e.getValueIsAdjusting()){//点击为true时才执行
            System.out.println(list1.getSelectedValue().toString());//获取选中列表数据
        }
    }
});

 


方式二:(推荐)

list1.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {//鼠标点击监听
        if(e.getClickCount()==2){//点击数量为2执行
            System.out.println(list1.getSelectedValue().toString());//获取选中列表数据
        }
    }
});

 


13、使用代码关闭窗体

传递jFrame值,并实现窗体关闭

public RegisterJFrame(JFrame jFrame) {//把窗体值传过来
    btn_cancel.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            //关闭此窗体
            jFrame.dispose();//只关闭此窗体
        }
    });
}