Java Swing--编写java应用界面-JFrame

Java Swing–编写java应用界面-JFrame

第一次发表文章,不足之处还望大家指正

任务描述

作为代码圈的新人,所以做的任务也都不是很复杂的,最近BOSS给了一个任务,利用JFrame做一个文件上传应用界面,应用界面的大致需求是支持系统托盘,登录界面,文件展示界面,文件上传界面等。因为第一次接触JFrame这系列的开发,所以做的不是很快,直接上代码吧!
完整代码链接:项目代码资源链接

登录界面

Java Swing--编写java应用界面-JFrame_第1张图片

public class Login {

	private static JFrame frame;

	public Login() {
	}
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {

		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					frame = new JFrame();
					frame.setTitle("登录页面");
					frame.setSize(670, 300);
					frame.setLocation(200, 200);
					frame.setAlwaysOnTop(true);

					frame.getContentPane().setLayout(null);

					// 参数输入位置一
					JLabel userName = new JLabel("*用户名:");
					// 文字设置
					userName.setForeground(Color.red);
					userName.setBounds(30, 30, 120, 30);
					userName.setLocation(50, 30);
					userName.setFont(new Font("宋体", Font.PLAIN, 14));
					frame.getContentPane().add(userName);

					// 参数输入框一  
					JTextField userNameValue = new JTextField();
					userNameValue.setLocation(134, 31);
					userNameValue.setSize(454, 30);
					userNameValue.setPreferredSize(new Dimension(100, 50));
					userNameValue.setBackground(Color.WHITE);
					// 对用户输入内容进行验证
					userNameValue.addCaretListener(new CaretListener() {
						@Override
						public void caretUpdate(CaretEvent e) {
							// TODO Auto-generated method stub
							JTextField textField = (JTextField) e.getSource();
							String text = textField.getText();
							if (text.length() == 0) {
								return;
							}
							char charAt = text.charAt(text.length() - 1);
							// 数字 0-9
							// 英文字母 A-z
							// 中文最常用的输入范围是u4E00-u9FA5,也有使用U+4E00~ U+9FFF 的,目前已知 U+9FA6~U+9FFF 之间的字符还属于空码
							if (!(charAt >= '0' && charAt <= '9' || charAt >= 'A' && charAt <= 'z'
									|| charAt >= '\u4E00' && charAt <= '\u9FA5')) {
								// 提示
								JOptionPane.showMessageDialog(textField, "只能输入中文,大小写字母,数字", "提示",
										JOptionPane.PLAIN_MESSAGE);
								SwingUtilities.invokeLater(new Runnable() {
									@Override
									public void run() {
										// TODO Auto-generated method stub
										// 去掉JTextField末尾字符
										textField.setText(text.substring(0, text.length() - 1));
									}
								});
							}
						}
					});
					frame.getContentPane().add(userNameValue);

					// 参数输入位置二
					JLabel password = new JLabel("*密码:");
					// 文字设置
					password.setForeground(Color.red);
					password.setBounds(71, 79, 120, 30);
					password.setLocation(50, 80);
					password.setFont(new Font("宋体", Font.PLAIN, 14));
					frame.getContentPane().add(password);

					// 参数输入框二
					JTextField passwordValue = new JTextField("");
					passwordValue.setLocation(134, 70);
					passwordValue.setSize(454, 30);
					passwordValue.setPreferredSize(new Dimension(100, 50));
					passwordValue.setBackground(Color.WHITE);
					// 对用户输入内容进行验证
					passwordValue.addCaretListener(new CaretListener() {
						@Override
						public void caretUpdate(CaretEvent e) {
							// TODO Auto-generated method stub
							JTextField textField = (JTextField) e.getSource();
							String text = textField.getText();
							if (text.length() == 0) {
								return;
							}
							char charAt = text.charAt(text.length() - 1);
							// 数字 0-9
							// 英文字母 A-z
							// 中文最常用的输入范围是u4E00-u9FA5
							// 也有使用U+4E00~ U+9FFF 的,但目前 U+9FA6~U+9FFF 之间的字符还属于空码,暂时还未定义,但不能保证以后不会被定义
							if (!(charAt >= '0' && charAt <= '9' || charAt >= 'A' && charAt <= 'z')) {
								// 提示
								JOptionPane.showMessageDialog(textField, "只能输入大小写字母,数字", "提示",
										JOptionPane.PLAIN_MESSAGE);
								SwingUtilities.invokeLater(new Runnable() {
									@Override
									public void run() {
										// TODO Auto-generated method stub
										// 去掉JTextField末尾字符
										textField.setText(text.substring(0, text.length() - 1));
									}
								});
							}
						}
					});
					frame.getContentPane().add(passwordValue);

					// 单选框
					JCheckBox savePWCheckBox = new JCheckBox("保存密码");
					// 默认不被选中
					savePWCheckBox.setSelected(false);
					savePWCheckBox.setBounds(50, 115, 130, 30);
					savePWCheckBox.setLocation(50, 120);
					frame.getContentPane().add(savePWCheckBox);

					// 登录按钮
					JButton loginButton = new JButton("登录");
					loginButton.setBounds(200, 170, 120, 30);
					loginButton.setLocation(200, 170);
					// 事件监听--跳转文件界面
					loginButton.addActionListener(getActionListener(userNameValue, passwordValue, frame));
					// 增加快捷键
					loginButton.registerKeyboardAction(getActionListener(userNameValue, passwordValue, frame),
							KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);
					frame.getContentPane().add(loginButton);

					// 取消按钮
					JButton cancellButton = new JButton("取消");
					cancellButton.setBounds(615, 337, 120, 30);
					cancellButton.setLocation(350, 170);
					cancellButton.addActionListener(new ActionListener() {
						@Override
						public void actionPerformed(ActionEvent e) {
							// TODO Auto-generated method stub
							// 这里需要注意    dispose是可以后台运行的
							frame.dispose();
						}
					});
					// 增加快捷键
					cancellButton.registerKeyboardAction(new ActionListener() {
						@Override
						public void actionPerformed(ActionEvent e) {
							// TODO Auto-generated method stub
							frame.dispose();
						}
					}, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);
					frame.getContentPane().add(cancellButton);

					// 这句话是窗口关闭确认的重点--即能否后台运行的重点
					frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
					frame.addWindowListener(new WindowAdapter() {
						@Override
						public void windowClosing(WindowEvent e) {
							// TODO Auto-generated method stub
							super.windowClosing(e);

							int option = JOptionPane.showConfirmDialog(frame, "确定退出系统? ", "提示 ",
									JOptionPane.YES_NO_OPTION);
							if (option == JOptionPane.YES_OPTION) {
								System.exit(0);
							}
						}
					});

					// 固定设置
					frame.setVisible(true);// 显示
					frame.setResizable(true);// 窗口可调

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});

	    // 添加应用托盘功能
		if (SystemTray.isSupported()) {// 判断系统是否支持托盘
			SystemTray tray = SystemTray.getSystemTray();// 获取系统托盘
			// 创建一个托盘图标对象
			Image image = Toolkit.getDefaultToolkit().getImage("resources/images/e6599b2722aefcc37912e87658aaa293.png");
			TrayIcon icon = new TrayIcon(image);
			/*
			 * try { trayicon = new
			 * TrayIcon(ImageIO.read(getClass().getClassLoader().getResource("d11.png"))
			 * ,"Tray demo",popup); } catch (IOException e1) {
			 * System.out.println("图片加载失败!"); }
			 */
			icon.setToolTip("FileUpload");
			icon.addMouseListener(new MouseListener() {
				@Override
				public void mouseReleased(MouseEvent e) {
					// TODO Auto-generated method stub
				}
				@Override
				public void mousePressed(MouseEvent e) {
					// TODO Auto-generated method stub
				}

				@Override
				public void mouseExited(MouseEvent e) {
					// TODO Auto-generated method stub

				}

				@Override
				public void mouseEntered(MouseEvent e) {
					// TODO Auto-generated method stub

				}

				@Override
				public void mouseClicked(MouseEvent e) {
					// TODO Auto-generated method stub
					if (e.getClickCount() == 2) {
						frame.setVisible(true);
					}
				}
			});
			// 图片显示不出来的一个关键点--很多人做这块图片无法显示很可能是图片大小不能自适应系统
			icon.setImageAutoSize(true);
			try {
				// 将托盘图表添加到系统托盘
				tray.add(icon);
			} catch (AWTException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

			// 创建托盘弹出菜单
			PopupMenu menu = new PopupMenu();
			// 添加一个用于退出的按钮
			MenuItem item = new MenuItem("exit");
			item.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					System.exit(0);
				}
			});
			menu.add(item);
			// 添加弹出菜单到托盘图标
			icon.setPopupMenu(menu);
		}
	}

    // 登录验证
	public static ActionListener getActionListener(JTextField userNameValue, JTextField passwordValue, JFrame frame) {

		ActionListener actionListener = new ActionListener() {
			// TODO Auto-generated method stub

			@Override
			public void actionPerformed(ActionEvent e) {

				// 获取用户输入的用户名密码
				String userNameWord = userNameValue.getText();
				String passwordWord = passwordValue.getText();

				// 判断用户名密码是否正确
				if ("zlq".equals(userNameWord) && "123".equals(passwordWord)) {

					// 关闭当前窗口
					frame.dispose();

					// 跳转到文件上传界面
					FileUpload fileUpload = new FileUpload();
					fileUpload.main(null);
				}

				if ("".equals(userNameWord) && "".equals(passwordWord)) {
					// 提示
					JOptionPane.showMessageDialog(frame, "不能为空", "提示", JOptionPane.PLAIN_MESSAGE);
				}
			}
		};
		return actionListener;
	}
}

以上是登录界面的代码,个人在做的时候注意的点包括:

  • 用户输入验证,这里调用了SwingUtilities.invokeLater 这是一个延迟执行的线程,即用户输入后执行;这里借鉴了这篇文章限制swing中的JTextField只能输入中文,字母,数字。
  • 登录验证方法,当用户输入出错演出提示框时,提示框的样式最好应用JOptionPane.PLAIN_MESSAGE
  • 取消按钮快捷键,取消按钮的功能是关闭窗口,应用隐藏,所以要使用frame.dispose();而不是System.exit(0);
  • 窗口关闭按钮(右上角的红X),frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);这句代码是重点,代表默认不做任何操作,一切交由窗口监听器frame.addWindowListener处理
  • 系统托盘设置,为了这句代码icon.setImageAutoSize(true);翻阅了很多博客,因为一开始我添加的图标一直无法正常显示,最后想明白了应该是图片没有适应系统图标的大小,敲了这句话就好了

文件上传界面—比较长 -_-

Java Swing--编写java应用界面-JFrame_第2张图片

public class FileUpload {

	private static JFrame frame;
	private static int compareTo = 0;

	public FileUpload() {
		frame = new JFrame();
		frame.setSize(1102, 585);
		frame.setLocation(200, 200);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
    
	private static void changDate(JTextField jTextField) {
		Runnable runnable = new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				if (compareTo < 0) {
					jTextField.setText("");
				}
			}
		};
		SwingUtilities.invokeLater(runnable);
	}

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {

		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {

					frame.setTitle("上传列表");
					frame.getContentPane().setLayout(null);

					// 标题一
					JLabel t1 = new JLabel(">>查条件");
					// 文字颜色
					t1.setForeground(Color.red);
					t1.setBounds(50, 50, 120, 30);
					t1.setLocation(5, 0);
					frame.getContentPane().add(t1);

					// 查询条件一
					JLabel startTimeLable = new JLabel("上传开始时间:");
					// 文字设置
					startTimeLable.setForeground(Color.BLACK);
					startTimeLable.setBounds(30, 30, 120, 30);
					startTimeLable.setLocation(30, 30);
					startTimeLable.setFont(new Font("宋体", Font.PLAIN, 14));
					frame.getContentPane().add(startTimeLable);

					// 搜索条件输入框一
					JTextField searchStartTime1 = new JTextField("");
					searchStartTime1.setLocation(150, 24);
					searchStartTime1.setSize(120, 30);
					searchStartTime1.setPreferredSize(new Dimension(100, 50));
					searchStartTime1.setBackground(Color.WHITE);
					// 日期选择插件
					DateChooser startTimeDateChooser1 = DateChooser.getInstance("yyyy-MM-dd");
					startTimeDateChooser1.register(searchStartTime1);
					frame.getContentPane().add(searchStartTime1);

					// 搜索条件中间字
					JLabel middleWord1 = new JLabel(" ─ ");
					// 文字设置
					middleWord1.setForeground(Color.BLACK);
					middleWord1.setBounds(264, 30, 120, 30);
					middleWord1.setLocation(270, 25);
					middleWord1.setFont(new Font("宋体", Font.PLAIN, 14));
					frame.getContentPane().add(middleWord1);

					// 搜索条件输入框二
					JTextField searchStartTime2 = new JTextField("");
					searchStartTime2.setLocation(300, 24);
					searchStartTime2.setSize(120, 30);
					searchStartTime2.setPreferredSize(new Dimension(100, 50));
					searchStartTime2.setBackground(Color.WHITE);
					// 日期选择插件
					DateChooser startTimeDateChooser2 = DateChooser.getInstance("yyyy-MM-dd");
					startTimeDateChooser2.register(searchStartTime2);
					// 实现对输入框内容的实时监控
					Document startTime2Document = searchStartTime2.getDocument();
					startTime2Document.addDocumentListener(new DocumentListener() {

						@Override
						public void removeUpdate(DocumentEvent e) {
							// TODO Auto-generated method stub
							System.out.println("remove:" + searchStartTime2.getText());
						}

						/*
						 * 这段代码是为了处理 Exception in thread "AWT-EventQueue-0"
						 * java.lang.IllegalStateException: Attempt to mutate in notification 这个错误,起因是
						 * 在调用文档监控器的内部方法中直接对 JTextField 进行修改 是不被允许的,因为当调用文档监控器时 JTextField会被监控器锁定
						 * 所以,此时需要调用一个延迟执行的线程队列,使得监控与更改队列执行,即可解决问题
						 */
						/*
						 * private void changDate() { Runnable runnable = new Runnable() {
						 * 
						 * @Override public void run() { // TODO Auto-generated method stub if
						 * (compareTo<0) { searchStartTime2.setText(""); } } };
						 * SwingUtilities.invokeLater(runnable); }
						 */

						@Override
						public void insertUpdate(DocumentEvent e) {
							// TODO Auto-generated method stub
							String startTime1 = searchStartTime1.getText();
							String startTime2 = searchStartTime2.getText();
							// >1 大于 <0小于 =0等于
							compareTo = startTime2.compareTo(startTime1);

							// 尾日起小于首日期 ----不正确
							if (compareTo < 0) {
								JOptionPane.showMessageDialog(frame, "尾日期小于首日期", "提示", JOptionPane.PLAIN_MESSAGE);
								changDate(searchStartTime2);
								// searchStartTime1.setText(""); 直接在方法内更改这是错误的
							}
						}

						@Override
						public void changedUpdate(DocumentEvent e) {
							// TODO Auto-generated method stub
							System.out.println("change" + searchStartTime2.getText());
						}
					});
					frame.getContentPane().add(searchStartTime2);

					// 查询条件二
					JLabel endTimeLable = new JLabel("上传结束时间:");
					// 文字设置
					endTimeLable.setForeground(Color.BLACK);
					endTimeLable.setBounds(30, 30, 120, 30);
					endTimeLable.setLocation(30, 80);
					endTimeLable.setFont(new Font("宋体", Font.PLAIN, 14));
					frame.getContentPane().add(endTimeLable);

					// 搜索条件输入框一
					JTextField searchEndTime1 = new JTextField("");
					searchEndTime1.setLocation(150, 74);
					searchEndTime1.setSize(120, 30);
					searchEndTime1.setPreferredSize(new Dimension(100, 50));
					searchEndTime1.setBackground(Color.WHITE);
					// 日期选择插件
					DateChooser endTimeDateChooser1 = DateChooser.getInstance("yyyy-MM-dd");
					endTimeDateChooser1.register(searchEndTime1);
					// 实现对输入框内容的实时监控
					Document endTime1Document = searchEndTime1.getDocument();
					endTime1Document.addDocumentListener(new DocumentListener() {

						@Override
						public void removeUpdate(DocumentEvent e) {
							// TODO Auto-generated method stub

						}

						@Override
						public void insertUpdate(DocumentEvent e) {
							// TODO Auto-generated method stub
							String startTime2 = searchStartTime2.getText();
							String endTime1 = searchEndTime1.getText();

							compareTo = endTime1.compareTo(startTime2);
							if (compareTo < 0) {
								JOptionPane.showMessageDialog(frame, "尾日期小于首日期", "提示", JOptionPane.PLAIN_MESSAGE);
								changDate(searchEndTime1);
							}
						}

						@Override
						public void changedUpdate(DocumentEvent e) {
							// TODO Auto-generated method stub
						}
					});
					frame.getContentPane().add(searchEndTime1);

					// 搜索条件中间字二
					JLabel middleWord2 = new JLabel(" ─ ");
					// 文字设置
					middleWord2.setForeground(Color.BLACK);
					middleWord2.setBounds(270, 64, 120, 30);
					middleWord2.setLocation(270, 75);
					middleWord2.setFont(new Font("宋体", Font.PLAIN, 14));
					frame.getContentPane().add(middleWord2);

					// 搜索条件输入框二
					JTextField searchEndTime2 = new JTextField("");
					searchEndTime2.setLocation(300, 74);
					searchEndTime2.setSize(120, 30);
					searchEndTime2.setPreferredSize(new Dimension(100, 50));
					searchEndTime2.setBackground(Color.WHITE);
					// 日期选择插件 --- 这个借鉴了博客
					DateChooser endTimeDateChooser2 = DateChooser.getInstance("yyyy-MM-dd");
					endTimeDateChooser2.register(searchEndTime2);
					// 实现对输入框内容的实时监控
					Document endTime2Document = searchEndTime2.getDocument();
					endTime2Document.addDocumentListener(new DocumentListener() {

						@Override
						public void removeUpdate(DocumentEvent e) {
							// TODO Auto-generated method stub

						}

						@Override
						public void insertUpdate(DocumentEvent e) {
							// TODO Auto-generated method stub
							String startTime1 = searchEndTime1.getText();
							String startTime2 = searchEndTime2.getText();

							compareTo = startTime2.compareTo(startTime1);
							if (compareTo < 0) {
								JOptionPane.showMessageDialog(frame, "尾日期小于首日期", "提示", JOptionPane.PLAIN_MESSAGE);
								changDate(searchEndTime2);
							}
						}

						@Override
						public void changedUpdate(DocumentEvent e) {
							// TODO Auto-generated method stub
						}
					});
					frame.getContentPane().add(searchEndTime2);

					// 查询条件三
					JLabel upStatusLable = new JLabel("上传状态:");
					// 文字设置
					upStatusLable.setForeground(Color.BLACK);
					upStatusLable.setBounds(30, 30, 120, 30);
					upStatusLable.setLocation(500, 30);
					upStatusLable.setFont(new Font("宋体", Font.PLAIN, 14));
					frame.getContentPane().add(upStatusLable);

					// 搜索条件下拉框
					String[] heros = new String[] { "", "已上传", "上传中", "部分失败" };
					JComboBox comboBox = new JComboBox(heros);
					comboBox.setBounds(599, 23, 80, 30);
					comboBox.setPreferredSize(new Dimension(500, 50));
					comboBox.setSize(new Dimension(200, 30));
					comboBox.setLocation(600, 24);
					frame.getContentPane().add(comboBox);

					// 查询按钮
					JButton buttonSearch = new JButton("查询");
					buttonSearch.setBounds(500, 90, 100, 20);
					buttonSearch.setLocation(500, 84);
					buttonSearch.addActionListener(new ActionListener() {
						@Override
						public void actionPerformed(ActionEvent e) {
							// TODO Auto-generated method stub
							String startTime1 = searchStartTime1.getText();
							String startTime2 = searchStartTime2.getText();
							String endTime1 = searchEndTime1.getText();
							String endTime2 = searchEndTime2.getText();
							Object selectedItem = comboBox.getSelectedItem();
						}
					});
					frame.getContentPane().add(buttonSearch);

					// 重置按钮
					JButton buttonReste = new JButton("重置");
					buttonReste.addActionListener(new ActionListener() {
						@Override
						public void actionPerformed(ActionEvent e) {
							searchStartTime1.setText("");
							searchStartTime2.setText("");
							searchEndTime1.setText("");
							searchEndTime2.setText("");
							comboBox.setSelectedIndex(0);
						}
					});
					buttonReste.setBounds(500, 90, 100, 20);
					buttonReste.setLocation(620, 84);
					frame.getContentPane().add(buttonReste);

					// 标题二
					JLabel t2 = new JLabel(">>结果列表");
					// 文字颜色
					t2.setForeground(Color.red);
					t2.setBounds(50, 50, 120, 30);
					t2.setLocation(5, 110);
					frame.getContentPane().add(t2);

					// 上传文件按钮
					JButton buttonUpLoadFile = new JButton("上传文件");
					buttonUpLoadFile.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent e) {
                            // 添加弹窗
							final JFrame fileFrame = new JFrame(">文件选择<");
							fileFrame.setSize(1070, 480);
							fileFrame.setLocationRelativeTo(null);

							fileFrame.getContentPane().setLayout(null);

							// 左子窗口
							JInternalFrame jInternalFrameL = new JInternalFrame("插入文件", true, true, true);
							jInternalFrameL.setBounds(0, 0, 500, 380);
							jInternalFrameL.setVisible(true);
							fileFrame.getContentPane().add(jInternalFrameL);

							// 以下是panelL 放置文件选择器
							Panel panelL = new Panel();

							panelL.setBounds(0, 0, 500, 500);
							panelL.setLocation(0, 0);
							panelL.setBackground(Color.WHITE);
							panelL.setVisible(true);
							jInternalFrameL.add(panelL);

							// 默认打开E盘的文件选择器
							final JFileChooser fileChooser = new JFileChooser("E://");
							fileChooser.setBounds(10, 10, 500, 500);
							fileChooser.setDialogTitle("nihao ");
							fileChooser.setToolTipText("wohao");

							// 文件选择策略
							// FILES_ONLY 仅显示文件 0
							// DIRECTORIES_ONLY 仅显示路径 1
							// FILES_AND_DIRECTORIES 显示文件和路径 2
							fileChooser.setFileSelectionMode(2);

							// 可多选
							fileChooser.setMultiSelectionEnabled(true);

							// 设置默认使用的文件过滤器
							fileChooser.setFileFilter(new FileNameExtensionFilter("文档(*.txt, *.doc)", "txt", "doc"));
							// 添加可用的文件过滤器(FileNameExtensionFilter 的第一个参数是描述, 后面是需要过滤的文件扩展名 可变参数)
							fileChooser.addChoosableFileFilter(
									new FileNameExtensionFilter("压缩文档(*.zip, *.rar)", "zip", "rar"));
							fileChooser.addChoosableFileFilter(
									new FileNameExtensionFilter("图片(*.jpg, *.png, *.gif)", "jpg", "png", "gif"));
                            
                            // 是否显示控制按钮
							fileChooser.setControlButtonsAreShown(false);
							panelL.add(fileChooser);

							// 右子窗口
							JInternalFrame jInternalFrameR = new JInternalFrame("待上传列表", true, true, true);
							jInternalFrameR.setBounds(550, 0, 500, 380);
							jInternalFrameR.setVisible(true);
							fileFrame.getContentPane().add(jInternalFrameR);

							// 以下是panelR 放置待上传列表
							Panel panelR = new Panel();
							panelR.setBounds(500, 0, 300, 500);
							panelR.setLocation(500, 0);
							panelR.setBackground(Color.WHITE);
							panelR.setVisible(true);
							jInternalFrameR.add(panelR);

							// 待上传文件表格
							// 表格
							Object[][] dataTem = {
									// 创建表格中的数据
									{ "1", "C://", "项目原型", "文件夹", "16MB" }, { "2", "E://", "流程图", "文件", "8MB" }, };
							// 创建表格中的横标题
							String[] titlesTem = { "序号", "文件路径", "名称", "类型", "大小" };

							// 声明表格默认数据
							DefaultTableModel model = new DefaultTableModel(dataTem, titlesTem) {
								private static final long serialVersionUID = 1L;

								// 表格数据不可编辑但可以选中
								public boolean isCellEditable(int row, int column) {
									return false;
								}
							};

							// 创建一个表格 引入数据
							JTable table = new JTable(model);
							table.setModel(model);
							table.setBounds(300, 300, 500, 370);
							table.setLocation(0, 0);

							// table内容居中
							DefaultTableCellRenderer tcr = new DefaultTableCellRenderer();
							tcr.setHorizontalAlignment(JLabel.CENTER);

							// 创建容器保存表格(只能是scrollPane)
							JScrollPane scrollPane = new JScrollPane();
							scrollPane.setBounds(0, 0, 500, 370);
							scrollPane.setSize(500, 370);

							// 铺满整个容器
							table.setFillsViewportHeight(true);

							// 设置表数据居中显示
							DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer();
							cellRenderer.setHorizontalAlignment(JLabel.CENTER);
							table.setDefaultRenderer(Object.class, cellRenderer);

							// 将table添加到scrollPane容器中
							// scrollPane.add(table);
							scrollPane.setViewportView(table);

							// 将表格容器加入frame
							panelR.add(scrollPane);

							// 以下是中间图标
							// 确认按钮
							JButton confirmSelectedButton = new JButton(new ImageIcon());
							confirmSelectedButton
									.setIcon(new ImageIcon("C:\\Users\\张刘强\\Desktop\\DM上传\\images\\上传查询\\u105.png"));
							confirmSelectedButton.setBounds(520, 90, 30, 40);
							confirmSelectedButton.setLocation(510, 120);
							confirmSelectedButton.addActionListener(new ActionListener() {
								@Override
								public void actionPerformed(ActionEvent e) {
									// TODO Auto-generated method stub
									File[] files = fileChooser.getSelectedFiles();

									if (files.length == 0) {
										System.out.println("文件夹是空的");
									} else {
										for (File file : files) {
											if (file.isDirectory()) {
												System.out.println("文件夹:" + file.getAbsolutePath());
											} else {
												System.out.println("文件:" + file.getAbsolutePath());
											}
										}
									}
								}
							});
							fileFrame.getContentPane().add(confirmSelectedButton);

							// 取消按钮
							JButton cancelSelectedButton = new JButton(new ImageIcon());
							cancelSelectedButton
									.setIcon(new ImageIcon("C:\\Users\\张刘强\\Desktop\\DM上传\\images\\上传查询\\u109.png"));
							cancelSelectedButton.setBounds(520, 90, 30, 40);
							cancelSelectedButton.setLocation(510, 200);
							cancelSelectedButton.addActionListener(new ActionListener() {
								@Override
								public void actionPerformed(ActionEvent e) {
									// TODO Auto-generated method stub
									int[] selectedRows = table.getSelectedRows();
									for (int i = 0; i < selectedRows.length; i++) {
										System.out.println("行号:" + selectedRows[i]);
									}
								}
							});
							fileFrame.getContentPane().add(cancelSelectedButton);

							// 以下是底端按钮
							// 上传按钮
							JButton uploadButton = new JButton("上传");
							uploadButton.setBounds(520, 90, 100, 25);
							uploadButton.setLocation(350, 390);
							fileFrame.getContentPane().add(uploadButton);
							// 关闭按钮
							JButton cancelButton = new JButton("关闭");
							cancelButton.setBounds(520, 90, 100, 25);
							cancelButton.setLocation(600, 390);
							cancelButton.addActionListener(new ActionListener() {
								@Override
								public void actionPerformed(ActionEvent e) {
									// TODO Auto-generated method stub
									fileFrame.dispose();
								}
							});
							fileFrame.getContentPane().add(cancelButton);

							// 固定设置
							fileFrame.setVisible(true);
							frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

						}
					});
					buttonUpLoadFile.setBounds(500, 90, 100, 20);
					buttonUpLoadFile.setLocation(5, 150);
					frame.getContentPane().add(buttonUpLoadFile);

					// 表格
					Object[][] data = {
							// 创建表格中的数据
							{ "1", "2018.10.18 11.12", "2018.10.18 11.13", "项目原型", "16MB", "已上传" },
							{ "2", "2018.10.18 11.12", "2018.10.18 11.13", "流程图", "8MB", "未上传" },
							{ "3", "2018.10.18 11.12", "2018.10.18 11.13", "相关文档", "10MB", "上传中" }, };
					// 创建表格中的横标题
					String[] titles = { "序号", "上传开始时间", "上传结束时间", "文件/文件夹名称", "文件大小", "上传状态" };

					// 声明表格默认数据
					DefaultTableModel model = new DefaultTableModel(data, titles) {
						/**
						 * 
						 */
						private static final long serialVersionUID = 1L;

						// 表格数据不可编辑但可以选中
						public boolean isCellEditable(int row, int column) {
							return false;
						}
					};

					// 创建一个表格 引入数据
					JTable table = new JTable(model);
					table.setModel(model);
					table.setBounds(300, 300, 500, 500);
					table.setLocation(5, 200);

					// 为表格添加双击事件
					table.addMouseListener(new MouseAdapter() {
						@Override
						public void mouseClicked(MouseEvent e) {
							// TODO Auto-generated method stub
							super.mouseClicked(e);

							if (e.getClickCount() == 2) {
								int row = ((JTable) e.getSource()).rowAtPoint(e.getPoint()); // 获得行位置

								int col = ((JTable) e.getSource()).columnAtPoint(e.getPoint());// 获得列位置

								System.out.println("行:" + row + "列:" + col);
							} else {
								return;
							}
						}
					});

					// 设置此表视图的首选大小
					table.setPreferredScrollableViewportSize(new Dimension(20, 20));

					// table内容居中
					DefaultTableCellRenderer tcr = new DefaultTableCellRenderer();
					tcr.setHorizontalAlignment(JLabel.CENTER);

					// 创建容器保存表格(只能是scrollPane)
					JScrollPane scrollPane = new JScrollPane();
					scrollPane.setBounds(5, 180, 1100, 370);

					// 铺满整个容器
					table.setFillsViewportHeight(true);

					// 设置表数据居中显示
					DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer();
					cellRenderer.setHorizontalAlignment(JLabel.CENTER);
					table.setDefaultRenderer(Object.class, cellRenderer);

					// 将table添加到scrollPane容器中
					// scrollPane.add(table);
					scrollPane.setViewportView(table);

					// scrollPane.setLayout(null);

					// 将表格容器加入frame
					frame.getContentPane().add(scrollPane);

					// 该设置是保证初始大小的 但是应用造成页面无法正常显示 暂时不处理
					// frame.pack();

					// 固定设置
					frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
					frame.addWindowListener(new WindowAdapter() {
						@Override
						public void windowClosing(WindowEvent e) {
							// TODO Auto-generated method stub
							super.windowClosing(e);

							int option = JOptionPane.showConfirmDialog(frame, "确定退出系统? ", "提示 ",
									JOptionPane.YES_NO_OPTION);
							if (option == JOptionPane.YES_OPTION) {
								System.exit(0);
							}
						}
					});
					frame.setVisible(true);
					frame.setResizable(true);

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
}

以上是文件展示界面和文件上传界面的代码,其中注意点是:

  • 文件展示界面
    • 日期选择插件是我直接在网上找的JAVA SWING 日期选择控件这篇文章对我帮助很大,很感谢博主
    • 输入框实时监控,Document startTime2Document = searchStartTime2.getDocument(); startTime2Document.addDocumentListener()一开始在选择监控器时,很纠结因为有两到三个控件都是可以实现这个功能的,个人认为这个更简易;这里需要实现日期大小的判断,如果日期选择错误,就把输入框置空,这里需要调用SwingUtilities.invokeLater(),具体原因我在代码中的注释解释了
    • JTable必须放在JScrollPane容器中,不然不会显示列头
    • 表格的双击事件,这个功能主要是实现查看某行数据的具体信息,一开始是要做一个按钮,点击按钮实现,后来觉得按钮实现太麻烦了,就直接以这个双击事件实现了
  • 文件上传界面
    • 窗口分片,这个功能利用JSplitPanel控件也是可以实现的,但是比较复杂,最后选用JInternalFrame这种特殊内部窗口来实现,将整个窗口分为三部分,之后拼接,方便简单
    • 文件选择器,文件格式过滤fileChooser.setFileFilter,个人认为这种声明方式比较简单明了

大致就是这些,的确要感谢CSDN上的很多博主,借鉴了很多内容才拼出来三个界面,当然代码中的很多功能还没具体实现,因为目前就做了这么多,后期继续做的话继续发吧。

如果代码中存在其他博主的内容,我没有表明的请联系我,因为最近看的博客太多了,然后自己各种修改,也没有记住都看了哪些!
第一次写文章,不足之处大家海涵 谢谢谢
Java Swing--编写java应用界面-JFrame_第3张图片

你可能感兴趣的:(JFrame)