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

Java Swing之多文档界面设计-JDesktopPane、JInternalFrame类简单应用示例 Java MDI多文档界面是一种用户界面风格,允许在一个主窗口中包含多个子窗口(文档窗口),每个子窗口可以显示不同的内容或功能模块,从而可以满足用户打开不同窗口完成不同功能的需求。开发多文档程序,一般需要JDesktopPane(桌面面板类)和JInternalFrame(内部窗体类)两个类。以下简单介绍,最后通过一个实例介绍实现逻辑。 阅读详情

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

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

任务描述

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

登录界面

在这里插入图片描述

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);翻阅了很多博客,因为一开始我添加的图标一直无法正常显示,最后想明白了应该是图片没有适应系统图标的大小,敲了这句话就好了

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

在这里插入图片描述

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,个人认为这种声明方式比较简单明了

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

如果代码中存在其他博主的内容,我没有表明的请联系我,因为最近看的博客太多了,然后自己各种修改,也没有记住都看了哪些!
第一次写文章,不足之处大家海涵 谢谢谢
在这里插入图片描述

1.Swing的概述(JFrame和JDialog) Swing是Java的图形用户界面(GUI)工具包,旨在提供丰富且可定制的界面组件,用于开发跨平台的桌面应用程序。它以抽象的窗口工具包(AWT)为基础,使跨平台应用程序可以使用可拔插的外观风格。 阅读详情

相关推荐

Java的Swing组件创建简易 的登录注册界面

import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; /** 构造登录界面 / public class DengLu extends JFrame{ public DengLu() { setTitle(...

WiFi_PRO的博客 2842

JInternalFrame的使用(窗口与面板)

阅前声明: http://blog.youkuaiyun.com/heimaoxiaozi/archive/2007/01/19/1487884.aspx5-1-1:JInternalFrame的使用类层次结构图:     java.lang.Object    --java.awt.Component    --java.awt.C

为天加朵云... 6024

Java Swing实现JFrame登录界面教程

JFrame是Swing库中用于创建窗口的主要类。它继承自Window类,并且是所有顶级窗口类(如JDialog和)的基类。JFrame提供了一个基本的框架,使得开发者可以在此之上构建复杂的用户界面。在Swing应用程序中,JFrame扮演着一个容器的角色,它可以容纳各种组件,如按钮、文本框、标签等。它也是整个应用程序的主入口,通常用于创建应用程序的主窗口。开发者可以在JFrame中添加各种菜单栏、工具栏以及状态栏,以构建出功能丰富、交互性高的桌面应用程序。

weixin_29092787的博客 995

javaSwing酒店管理

在这篇博客中,我们将介绍一个基于MySQL数据库、Java编程语言和Swing图形用户界面的简单酒店管理系统。该系统包括了查询房客信息、查询房客状态、修改房客信息、添加房间信息、添加住户、退房管理、预定管理、退订管理、入账管理、出账管理、修改资料等多个功能。表示酒店客房的预订信息,每条记录对应一个预订订单。 字段解释: id: 预订编号,主键。 name: 预订人姓名。 phone: 预订人电话。 checkTime: 预订入住时间。 creditTime: 订单创建时间。 state: 预订状态(已退订等

平安喜乐 1301

JFrame文件上传Java_swing应用

一个Java应用,包含登录,文件上传,日期选择(检索条件),文件检索功能 大家可以根据自己需要改装使用

Swing模板样式(全56种经典)

Swing模板样式(全56种经典)

JInternalFrame的使用

JInternalFrame的使用 类层次结构图:      java.lang.Object     --java.awt.Component     --java.awt.Container        --javax.swing.JComponent              --javax.swing.JInternalFrame    JinternalFrame的使用

juce的专栏 1077

3.6KW储能双向逆变器(原理图PCB源码)

通过百度网盘分享的文件:优快云 3.6KW储能双向逆变器 链接:https://pan.baidu.com/s/18NN6KnpywFUIDtAQ4b1LTg?pwd=csdn 提取码:csdn

2401_86562087的博客 2184

Java Swing模仿Windows自带的计算器

本次程序设计涉及到 Java 的基本语法,即课堂上所介绍的变量、条件语句、循环语句、数组、方法、类、对象、继承、多态、异常等,除此之外还可能涉及图形用户界面编(GUI输入输出作(I0家进行自学,其中GUI开发涉及的 swing 组件或者iavafx 组件,请大家选择其中一个组件自行学习进行 GU的开发。1) 本次程序设计是专门针对 Java 课程的,要求使用 Java 语言进行具有一定代码量的程序开发。程序的设计要结合一定的算法,在进行代码编写前要能够设计好自己的算法。

编程无忧 484

XGBoost与Embedding混合建模实战解析

在机器学习领域,特征工程与模型融合是提升预测性能的关键技术。Embedding技术通过将高维稀疏特征(如文本、ID类数据)转化为低维稠密向量,有效捕获语义关联;而XGBoost作为强大的集成学习算法,擅长处理结构化特征并进行自动特征组合。两者结合的混合架构(如Semantic Boosted Trees)在金融风控和推荐系统等场景中展现出显著优势,尤其在处理用户行为序列、商品ID等复杂特征时,相比传统方法能获得更好的模型效果。本文通过电商推荐和金融反欺诈等案例,详解如何实现Embedding+XGBoost

weixin_28718641的博客 325

手把手调试Android 10 DHCP服务:从dumpsys network_stack到DhcpServer.java的实战技巧

本文详细介绍了在Android 10中调试DHCP服务的实战技巧,从使用dumpsys network_stack分析服务状态到深入DhcpServer.java源码追踪问题。文章提供了完整的工具链配置、关键调试命令和常见问题解决方案,帮助开发者高效解决DHCP服务未启动、IP分配失败等典型问题,特别适合需要深入理解Android网络架构的开发者参考。

uu89012的博客 743

JAVA SWING之JFrame和JPanel布局

初学JAVA的时候学习过SWING,每次写程序就直接复制Jframe和Jpanel设置,到现在也不清楚它们有什么关系,才回顾学习。Swing虽然是很老的技术了,但也有很多工具是Swing写的例如JetBrains系列,最常用的IDEA。开发一下小工具还是不错的。掌握整体布局后,再去写代码和各标签就很简单了。 学习资料参考:Swing学习 一、JFrame窗口 1.什么是JFrame JFrame 用来设计类似于 Windows 系统中窗口形式的界面。JFrame 是 Swing 组件的顶层容器,该类继承了

小轩的名古屋 2万+

基于MATLAB对地下水水位的数据处理

本文借用Matlab强大的计算功能和绘图功能,对某阿拉干监测数据进行曲线拟合,得到拟合函数。再利用GM(1.1)时间序列模型构建地下深埋的预测模型,进而对阿拉干 2021,四个位置H1,H2,H3,H4年度各监测井平均深埋位置变化进行分析。

keykangkang1001的博客 1244

使用Java编写一个简单的 JFrame登陆注册界面(一)

使用Java awt 及 Swing 组件编写一个简单的登陆界面。 示例: 下面开始介绍如何编写。 通过调用实例化一个JFrame框架,在框架内嵌入JPanel,在JPanel上进行添加控件。 package com.main.frame; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event....

baidu_38693912的博客 2万+

嵌入式常用通信协议 #概述

嵌入式通信协议

AFK3060的博客 2116

博流BL602开发二 环境搭建与固件烧录实战

本文详细介绍了博流BL602 RISC-V芯片开发环境的搭建与固件烧录全流程。从Linux/WSL系统选择、RISC-V工具链配置、SDK获取,到编译首个Wi-Fi示例并生成固件镜像,再到通过命令行或图形化工具完成烧录及串口测试,提供了完整的实战指南和常见问题解决方案。

weixin_29175469的博客 451

Java图形化界面设计之容器(JFrame)详解

AWT是比较旧的双介面函式库,它依然高度倚赖各作业平台自身所具备的绘图功效机能,且用一个比包容程式(Wrapper)还小的设计还去除、吸收各作业平台间的绘图功能机能差异,以致Java程式在跨平台移携后的绘图呈现不够一致,这使得AWT遭受到众多的批评。这意味着:AWT的Widget倚赖作业平台自身原有的Widget功效机能,程式设计师在开发撰写时必须去了解各作业平台在Widget方面的差异性,如此便偏离了Java程式语言最初的宗旨:跨平台一致性。

mfnyq的博客 7445

分子动力学仿真软件:LAMMPS_(16).应用案例分析

通过以上四个应用案例,我们详细介绍了如何使用LAMMPS进行不同系统的分子动力学仿真。从简单的液体水仿真到复杂的纳米管仿真,每个案例都包含了详细的步骤说明和代码示例。读者可以通过这些示例实际操作并验证结果,从而更好地理解LAMMPS的功能和使用方法。希望这些案例能够为读者在分子动力学仿真领域的研究和应用提供帮助。

kkchenjj的博客 837

Java基础-Swing图形界面、JFrame框架窗体

1、Swing是GUI(图形用户界面)开发工具包,其包括容器、组件和布局等,继承AWT。与用户交互时涉及事件的概念。 2、JFrame框架窗体 JFrame框架窗体是一个容器,是Swing程序中各个组件的载体, JFrame jf = new JFrame();//创建 在开发中更常用的方式是通过继承java.swing.JFrame类创建一个窗体。 在JFrame对象创建完成后,需要...

洋葱专栏-有灵魂的程序员 7516

利用蓝牙低功耗技术与位置数据,提升邮政运输工具及笼车追踪的效率

BLE 即蓝牙低功耗技术,与无线音箱或各类电脑配件所用的技术类似。正如其名,BLE 的特点是:在实现相近传输范围的同时,功耗显著更低。这让它能应用于对电池续航要求极高的场景。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 779

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java Swing之JFrame、JPanel

Java Swing之JFrame和JPanelJFrame窗口容器和JPanel面板容器JFrame(窗口容器)JPanel(面板容器) JFrame窗口容器和JPanel面板容器 Java Swing中,任何一个Swing组件都需要置于一个顶层容器中。JFrame窗口和JPanel面板是常用的顶层容器。JFrame中的顶层容器主要有JFrame、JDialog 和 JApplet。 JFrame(窗口容器) Java GUI程序基本思路是以JFrame为基础,用来设计类似于Windows系统中窗口形式的

tianjh1129的博客 6万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java Swing概述: JFrame窗体和JDialog窗体

GUI(图形用户界面)为程序员提供图形界面,它最初的设计目的死为了程序员构建一个通用的GUI,使其能够在所有的平台上运行,但是Java 1.0 中的基础类AWT(抽象窗口工具箱)并没有达到这个要求,于是Swing出现了,它是AWT组建的增强组建,但是它并不能完全替代AWT,这两种组件需要同时出现在一个图形用户界面中。 Swing组件 原来的AWT组件来自java.awt包,当含有AWT组件的j...

weixin_42545594的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java Swing窗口组件实战解析:JFrame与标签组件的应用

本文解析了JavaSwing中JFrame窗口和JLabel标签组件的应用。通过典型考题详细讲解了三处关键代码:1)继承JFrame类创建窗口;2)定义init初始化方法;3)将标签添加到内容面板。完整代码展示了创建包含居中文本标签的Swing窗口流程,核心知识点包括:JFrame窗口基础、组件容器操作、JLabel属性设置及初始化方法的使用。文章还总结了常见错误和应试技巧,帮助掌握Swing界面开发的基础操作。

Java程序员_编程开发学习笔记_网站安全运维教程_渗透技术教程 701

JAVA_Swing中的JFrame介绍

JFrame:屏幕上windows的对象 Swing 的三个基本构造块:标签、按钮和文本字段 JFrame 类就是解决这个问题的——它是一个容器,允许程序员把其他组件添加到它里面,把它们组织起来,并把它们呈现给用户。 Java 事件模型基础:监听器、事件、事件源、事件注册 事件:描述发生了什么的对象 事件源:事件的产生器 事件处理器:接收事件、解释事件并处理用户交互的方法 比如在Button组件上点击鼠标会产生以这个Button为源的一个ActionEvent,这个ActionEvent实例是一个对象,它包

imrush2019的博客 2878

Java Swing JFrame设置大小

  1、单独使用setSize()时,是按照设置的大小显示的;此时不能使用pack(),否则按照pack()自动适配2、单独使用pack()时,是按照组件的大小自动适配的3、单独使用setPreferredSize()时,设置的大小无效,必须在后面添加pack()配合显示pack() 调整此窗口的大小,以适合其子组件的首选大小和布局,就算JFrame用setSize来设定框体大小,用了pa...

iteye_4972的博客 6871

Java-Swing 常用窗口之JFrame窗口

Swing:GUI(图形用户界面)为程序提供图形界面,它是AWT组件的增强组件,它并不能完全代表AWT组件,这两种组件需要同时出现在一个图形用户界面 Swing特点这里就不详细阐述了,主要写一下JFrame窗体的常用操作 JFrame窗口是一个容器,它是Swing程序中各个组件的载体 JFrame窗体在Java应用程序中的使用方法如下 public class JFrame窗体 extends J...

qq_42724864的博客 913
下一篇: 集合知识点一 : List/Set接口实现类
Amos_Object
博客等级 码龄8年 0粉丝 3原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值