这是我第一次用java编写界面,主要要实现的功能是 1 可以选择任意文件夹内的图片,选择好之后可以显示在界面上;2 点击“聚类按钮”之后会弹出另一个界面可以输入需要聚类的图片个数,以及聚类成功后保存的位置,当点击“确定”按钮之后,对选择好的图片按照需求进行聚类并保存在自己选择的路径上。
ok以上是功能的简单介绍,下面我们开始吧~

(要用java做界面,我建议使用myeclipse,因为可以拖动控件,不用自己写代码生成控件)
1 fiel-->new project完成之后,右键点击新建的project--->new other 选择swing Matisse Form

next 之后选择jFram这个类型 我把这个Fram取名为appearance,点击确定之后会有下面的样子

大家可以看到左边有一个.java的文件,右边是一些可以拖动的控件。
2 拖动一个button到显示的fram中间,将button上显示的文字改为“选择文件”之后在拖动一个jpanel到你的frame中
3 双击这个button就可以到达系统自动为你生成的代码中去。如果你的button的名字没有变化,就把监听button 的动作的这一段代码修改成下面这些:(代码之后都有注解,请仔细研究~~)
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
JFileChooser jfc = new JFileChooser(); //新建一个选择文件夹的类型
if (jfc.showOpenDialog(appearance.this) == JFileChooser.APPROVE_OPTION) { //开始选择路径
System.out.println(jfc.getSelectedFile().getAbsolutePath());//打印出所选择的图片的路径
//---------------------------把选择的图片显示在面板上----------------------//
ImageIcon imageIcon = new ImageIcon(jfc.getSelectedFile()
.getAbsolutePath()); //新建一个ImageIcon,这个ImageIcon等于上面所取路径上的图片
JLabel jLabel = new JLabel(imageIcon);//新建一个JLabel,把图片放进去
jLabel.setBounds(0, 0, imageIcon.getIconWidth(), imageIcon
.getIconHeight());//设置JLabel的大小
jPanel1.add(jLabel);//把JLabel加进panel1中,显示出来
// jPanel1.setBounds(50, 50, 100, 100);
//frame.add(jPanel);
//frame.setBounds(100, 100, 720, 520);
//frame.setVisible(true);
}
}
需要注意的是,因为我用的都是自动拖进去的控件,所以我没有new frame也没有new jPanel,因为系统自动都生成了,所以没有使用拖动控件的朋友要自己在代码中添加new frame和 jPanel,并且要设置这些控件的大小,就像我已经用//屏蔽了的那些代码一样。执行结果如下:

选择文件成功后

好的,这样第一步我们已经完成了,那么接下来就是当点击另一个聚类按钮时要弹出另一个对话框,使得我们可以输入聚类的个数以及聚类后新生成的图片的保存位置。
4 右键点击新建的project--->new other 选择swing Matisse Form Next之后选择jFram,我取名为appearance_choose.同样的,得到一个.java文件和一个设计用的文件
5 在之前的appearance的界面中拖进一个button改名为“开始聚类”双击这个按钮,到达编辑按钮触发的界面(也就是那个.java文件)
把这段代码改成下面的:
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
appearance_choose AC = new appearance_choose(); //新建一个appearance_choose类
AC.setVisible(true); //点击这个按钮之后转到appearance_choose页面
}
6 删除appearance_choose类中自动生成的main()函数,因为它不需要。
7 注意,在appearance_choose这个类中,在它的构造函数中加入这样一句话:
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
也就是把构造函数变成这样:
public appearance_choose() {
initComponents();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
}
多加的这句话可以使得你关闭新跳出来的这个窗口的时候不会同时关闭你的主窗口。
执行效果如下:

按照上面显示的设计appearance_choose这个页面,可以输入文字的地方是text Field, 显示提示文字用的是Label这个控件。
之后可以像做第一个frame的界面一样对每个button添加相应的代码,实现你想实现的功能,需要提示的是,传参数,如果想得到textField里面的参数(例如你新建的textField名字叫textField1),就用jTextField1.getText() 就可以得到里面类型为String的值,如果传的是int值,需要对String 进行强制性的类型转换:Integer.parseInt(jTextField1.getText())。
转自http://blog.sina.com.cn/s/blog_7d8f0a900100qy2a.html