Swing实践总结:
情景:需要用eclipse写一个gui的界面,不需要太复杂,简单的布局显示和点击事件上传或者是选择文件的功能就okay。
无事件的简单布局:
备注知识:
主要就是实例JFrame,控制JFrame的位置,然后不断往JFrame里一直塞其他控件,
JFrame->JScrollPane ->JPane->Jtutton,Jlist等等,前面的可以装后面的任意一种
JFrame 的默认布局是(BorderLayout,东西南北中)
JPane的默认布局是(FlowLayout,一个接一个排,排不下了换行/换列)
还有无论什么布局,看完后记得多看几遍你的每个控件所在位置,很多bug你会发现是控件在位置上相互遮挡甚至是相互覆盖造成的
以及如果你设置了JScrollPane一层,记得也要给JScrollPane设置setBounds,不然会看不到滚动条
JLabel 不仅可以放文字也可以放图片,有时候在太长了放不下怎么办,可以尝试用HTML语法“只要嵌入”他就会自动换行,但是对于数字你必须还要嵌入
才可以换行。
JFrame->JScrollPane ->JPane 这三个是容器,你对容器里的容器或者控件设置setBounds(x位置,y位置,宽,高),他的xy其实是相对父容器的
JFrame jframe = new JFrame(title);// 实例化一个JFrame,“title”是最后显示框的显示
JPanel apk1_JPane_UpLoad = new JPanel(); // 选择第一个按钮的jpanel
JPanel apk2_JPane_UpLoad = new JPanel(); // 选择第二个按钮的jpanel
JPanel apk_JPane_Show = new JPanel();// 展示数据的时候的jpanel
jframe.setLayout(null);//把布局置空后面才能用绝对布局s
jframe.add(apk1_JPane_UpLoad);
jframe.add(apk2_JPane_UpLoad);
// 添加滚动条
JScrollPane apk_JScrollPane_Show = new JScrollPane(apk_JPane_Show);
jframe.add(apk_JScrollPane_Show);
apk1_JPane_UpLoad.setBounds(200, 10, 400, 80);
apk2_JPane_UpLoad.setBounds(630, 10, 400, 80);
apk2_JPane_UpLoad.setLayout(null);
apk1_JPane_UpLoad.setLayout(null);
apk_JPane_Show.setLayout(null);
apk_JPane_Show.setBounds(10, 100, 1180, 850);
apk_JPane_Show.setPreferredSize(new Dimension(1180, 850));//对于jpanel记得设置setPreferredSize
apk_JScrollPane_Show.setBounds(10, 100, 1180, 850);
//=======================下面的init都是把面板传进去,然后设置一些子控件===========
initVersion(apk_JPane_Show);
initSize(apk_JPane_Show);
initPackageName(apk_JPane_Show);
initPermission(apk_JPane_Show);
initApk1Select(apk1_JPane_UpLoad);
initApk2Select(apk2_JPane_UpLoad);
jframe.setVisible(true);// 可见
jframe.setSize(1200, 990);// 窗体大小
jframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);// close的方式
//=====下面是为了让屏幕显示在正中间========================
int windowWidth = jframe.getWidth(); // 获得窗口宽
int windowHeight = jframe.getHeight(); // 获得窗口高
Toolkit kit = Toolkit.getDefaultToolkit(); // 定义工具包
Dimension screenSize = kit.getScreenSize(); // 获取屏幕的尺寸
int screenWidth = screenSize.width; // 获取屏幕的宽
int screenHeight = screenSize.height; // 获取屏幕的高
jframe.setLocation(screenWidth / 2 - windowWidth / 2, screenHeight / 2 - windowHeight / 2);
jframe.setResizable(false);//设置窗口不允许用户去拉大拉小
点击时间文件上传或者是选择
首先JButton注册点击事件
//apk1_JButton_UpLoad是一个JButton按钮
apk1_JButton_UpLoad.addMouseListener(new MouseAdapter() { // 添加鼠标点击事件
public void mouseClicked(MouseEvent event) {
eventOnImport(new JButton(), FLAG_APK1);//在点击事件里随意添加自己的逻辑
}); // 文件上传功能
具体的上传逻辑,如果我们不想要上传只想要选择,也可以,在得到fileName的地方其实我们已经get到这个file了,我们可以用file的getAbsolutePath()方法,就可以得到路径了,我们可以在任何需要的地方去用inputstream去读取这个File文件,所以我们可以删掉后面的输入输出部分的代码。
/**
* 文件上传功能
*
* @param apk_JButton_UpLoad
* 按钮控件名称
*/
public static void eventOnImport(JButton apk_JButton_UpLoad, String flag) {
JFileChooser chooser = new JFileChooser();//文件选择器
chooser.setMultiSelectionEnabled(true);
/** 过滤文件类型 * */
FileNameExtensionFilter filter = new FileNameExtensionFilter("war", "xml", "txt", "doc", "docx", "zip", "apk");
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(apk_JButton_UpLoad);
if (returnVal == JFileChooser.APPROVE_OPTION) {
/** 得到选择的文件* */
File[] arrfiles = chooser.getSelectedFiles();
if (arrfiles == null || arrfiles.length == 0) {
return;
}
FileInputStream input = null;
FileOutputStream out = null;
String path = "./";//设置存储的位置是当前项目的上一层
String fileName = "";
try {
for (File f : arrfiles) {
File dir = new File(path);
fileName = f.getName();//这里得到的是文件的名字
/** 目标文件夹 * */
File[] fs = dir.listFiles();
HashSet<String> set = new HashSet<String>();
for (File file : fs) {
set.add(file.getName());//这里得到的不是
}