Java使用JFrame开发出漂亮的桌面程序附源码下载(谁说Java不可以开发出漂亮的界面)

1、Java使用JFrame开发出漂亮的桌面程序附源码下载

源码下载:https://download.csdn.net/download/nosprings/12048149

Java使用JFrame开发出漂亮的桌面程序附源码下载

/**  
* <p>Title: MainFrameTest.java</p>  
* <p>Description: </p>  
* <p>Copyright: Copyright (c) 2019</p>  
* <p>Company: www.nosprings.com</p>  
* @author liuhaibing
* @date 2019年3月22日  
* @version 1.0  
*/
package com.jdesktop;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.JSplitPane;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Random;
import java.awt.event.ActionEvent;
import javax.swing.JSeparator;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import javax.swing.JSlider;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.event.ChangeListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

import org.apache.log4j.Logger;

import com.jdesktop.desktopsnapshot.DeskTopSnapshot;
import com.jdesktop.messages.Message;
import com.jdesktop.tcpclient.TcpImageReceiver;
import com.jdesktop.tcpserver.TCPServer;
import com.jdesktop.udpreceiver.UDPReceiver;
import com.jdesktop.udpsender.UDPSender;

import javax.swing.event.ChangeEvent;

/**
 * @author liuhaibing
 * @date 2019年3月22日
 * @version 1.0
 */
public class JDesktopUI extends JFrame {

	private static Logger log = Logger.getLogger(JDesktopUI.class.getClass());
	
	private static JDesktopUI frame; // 主界面
	private static JSplitPane splitPane; // 左右分割窗口
	private static JSplitPane rightSplitPanel; // 右侧上下分割窗口
	private JPanel contentPane;
	private JComboBox roomList;
	private JTextArea recMsg;
	private JTextArea sendMsg;
	private JLabel desktopLable;
	
	private JButton startBroadCast;

	// 通过当前的类得到classpath
	private static String basePath = JDesktopUI.class.getResource("/").getPath();
	private static ImageIcon startIcon = new ImageIcon(basePath + "icons/shape_square.png");
	private static ImageIcon icon2 = new ImageIcon(basePath + "icons/application_home.png");
	private static ImageIcon icon3 = new ImageIcon(basePath + "icons/photo.png");
	private static ImageIcon icon4 = new ImageIcon(basePath + "icons/application_osx_terminal.png");
	private static ImageIcon icon5 = new ImageIcon(basePath + "icons/folder_go.png");
	private static ImageIcon icon6 = new ImageIcon(basePath + "icons/emoticon_smile.png");

	// 通讯工作相关
	private static int defaultUDPClientPort = 8055;
	private static int defaultUDPServerPort = 8066;
	
	// UDP消息发送
	private UDPSender udpSender = new UDPSender(defaultUDPClientPort); // 本地端口是8055
	private UDPReceiver udpServer;
	private String broadcastAddress = "255.255.255.255";  // 广播地址
	
	// TCP消息发送
	private TCPServer tcpServer;
	private TcpImageReceiver tcpReceiver;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		frame = new JDesktopUI();
		frame.setVisible(true);
		splitPane.setDividerLocation(0.75);
		rightSplitPanel.setDividerLocation(0.60);
		frame.startUDPServer(defaultUDPServerPort);
	}

	public void startUDPServer(int port) {
		udpServer = new UDPReceiver(port);
		udpServer.start();

		// 启动线程,接受数据并刷新到接受窗口
		new Thread(new Runnable() {
			public void run() {
				while (true) {	
					log.info("udp阻塞1");
					synchronized (udpServer.queue) {
						log.info("udp阻塞2");
						if(udpServer.queue.size() == 0) {
							try {
								// System.out.println("udp阻塞");
								log.info("udp阻塞3");
								udpServer.queue.wait();
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}else {
							Iterator<Message> it = udpServer.queue.iterator();
							while(it.hasNext()) {
								final Message message = it.next();
								it.remove();
								// 这个是UI编程的一个机制:子线程访问GUI线程的时候必须这么使用
								SwingUtilities.invokeLater(new Runnable() {
									public void run() {
										// 收到的消息从队列里取出来,整理格式
										String newMessage = "";
										newMessage += "【" + message.getIpAddress() + "】:";
										newMessage += message.getTime().toLocaleString() + "\n";
										newMessage += message.getContent() + "\n";
										// 然后刷新到接受窗口
										recMsg.append(newMessage);
									}
								});
							}
						}
					}

				
				}
			}

		}).start();
	}

	public void startTcpServer(int port) {
		tcpServer = new TCPServer(8088);
		tcpServer.start();
		DeskTopSnapshot deskTopSnapshot = new DeskTopSnapshot();
		deskTopSnapshot.start();
	}
	
	public void startTcpClient(String ip, int port) {
		tcpReceiver = new TcpImageReceiver("10.0.2.253", 8088);
		tcpReceiver.start();
		
		// 启动线程,接受数据并刷新到接受窗口
		new Thread(new Runnable() {
			public void run() {
				while (true) {
					synchronized (tcpReceiver.clientImageQueue) {
						if(tcpReceiver.clientImageQueue.size() == 0) {
							try {
								System.out.println("TCP阻塞");
								tcpReceiver.clientImageQueue.wait();
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}else {
						
							try {
								//System.out.println(tcpReceiver.clientImageQueue.size());
								final Image image = tcpReceiver.clientImageQueue.poll();
								//System.out.println(tcpReceiver.clientImageQueue.size());
								SwingUtilities.invokeLater(new Runnable() {
									public void run() {
										// System.out.println("刷新图片");
										
										ImageIcon imageIcon = new ImageIcon(image);    // Icon由图片文件形成
										Image image = imageIcon.getImage();                         // 但这个图片太大不适合做Icon
//										    为把它缩小点,先要取出这个Icon的image ,然后缩放到合适的大小
										Image smallImage = image.getScaledInstance(desktopLable.getWidth(),desktopLable.getHeight(),Image.SCALE_SMOOTH);
//										    再由修改后的Image来生成合适的Icon
										ImageIcon smallIcon = new ImageIcon(smallImage);
										
										desktopLable.setIcon(smallIcon);
										
										//desktopLable.repaint();
										//desktopLable.updateUI();
										//desktopLable.setVisible(true);
										frame.invalidate();
									}
								});
							} catch (Exception e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}
					}
				}
			}

		}).start();
	}
	
	/**
	 * Create the frame.
	 */
	public JDesktopUI() {
		setTitle("JDesktop共享软件");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 850, 532);

		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);

		JMenu sysSet = new JMenu("设置");
		menuBar.add(sysSet);

		JMenuItem exit = new JMenuItem("退出");
		exit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		sysSet.add(exit);

		JMenu help = new JMenu("帮助");
		menuBar.add(help);

		JMenuItem helpItem = new JMenuItem("帮助");
		help.add(helpItem);

		JSeparator separator = new JSeparator();
		help.add(separator);

		JMenuItem about = new JMenuItem("关于");
		help.add(about);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);

		JToolBar toolBar = new JToolBar();
		contentPane.add(toolBar, BorderLayout.NORTH);

		startBroadCast = new JButton();
		startBroadCast.setIcon(startIcon); // 给button添加图片
		startBroadCast.setText("开始广播");

		startBroadCast.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				frame.startTcpServer(8088);
				startBroadCast.setText("正在广播");
			}
		});
		toolBar.add(startBroadCast);

		JButton desktopDetect = new JButton();
		desktopDetect.setText("桌面监控");
		desktopDetect.setIcon(icon3); // 给button添加图片
		toolBar.add(desktopDetect);

		JButton game = new JButton();
		game.setText("小游戏");
		game.setIcon(icon4); // 给button添加图片
		toolBar.add(game);

		JButton fileShare = new JButton();
		fileShare.setText("文件共享");
		fileShare.setIcon(icon5); // 给button添加图片
		toolBar.add(fileShare);

		JLabel chooseRoom = new JLabel("    选择教室: ");
		toolBar.add(chooseRoom);

		String[] schoolRoom = { "第一教室", "第二教室", "第三教室", "第四教室", "第五教室" };
		roomList = new JComboBox(schoolRoom);
		toolBar.add(roomList);

		JButton enterRoom = new JButton();
		enterRoom.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				frame.startTcpClient("127.0.0.1", 8088);;
			}
		});
		enterRoom.setIcon(icon2); // 给button添加图片
		enterRoom.setText("进入");
		toolBar.add(enterRoom);

		JLabel setViewClear = new JLabel("    设置清晰度:");
		toolBar.add(setViewClear);

		JSlider slider = new JSlider();
		slider.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
			}
		});
		toolBar.add(slider);

		splitPane = new JSplitPane();
		contentPane.add(splitPane, BorderLayout.CENTER);

		JPanel rightPanel = new JPanel();
		splitPane.setRightComponent(rightPanel);
		rightPanel.setLayout(new BorderLayout(0, 0));

		rightSplitPanel = new JSplitPane();
		rightSplitPanel.setOrientation(JSplitPane.VERTICAL_SPLIT);
		rightPanel.add(rightSplitPanel, BorderLayout.CENTER);

		JPanel topPanel = new JPanel();
		rightSplitPanel.setLeftComponent(topPanel);
		topPanel.setLayout(new BorderLayout(0, 0));

		recMsg = new JTextArea();
		recMsg.setAutoscrolls(true);
		recMsg.setLineWrap(true);
		recMsg.setWrapStyleWord(true);
		JScrollPane recScroll = new JScrollPane(recMsg);
		recScroll.setVerticalScrollBarPolicy(
		JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		topPanel.add(recScroll, BorderLayout.CENTER);
		
		JPanel bottomPanel = new JPanel();
		rightSplitPanel.setRightComponent(bottomPanel);
		bottomPanel.setLayout(new BorderLayout(0, 0));

		JToolBar talkToolBar = new JToolBar();
		bottomPanel.add(talkToolBar, BorderLayout.NORTH);

		JButton btnNewButton_2 = new JButton();
		btnNewButton_2.setIcon(icon6);
		talkToolBar.add(btnNewButton_2);

		sendMsg = new JTextArea();
		sendMsg.setAutoscrolls(true);
		sendMsg.setLineWrap(true);
		sendMsg.setWrapStyleWord(true);
		JScrollPane sendScroll = new JScrollPane(sendMsg);
		sendScroll.setVerticalScrollBarPolicy(
		JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		bottomPanel.add(sendScroll, BorderLayout.CENTER);

		/*
		 * StyledDocument doc = (StyledDocument) sendMsg.getDocument();
		 * 
		 * Style style = doc.addStyle("StyleName", null); StyleConstants.setIcon(style,
		 * icon3);
		 * 
		 * try { doc.insertString(doc.getLength(), "ignored text", style); } catch
		 * (BadLocationException e1) { // TODO Auto-generated catch block
		 * e1.printStackTrace(); }
		 */

		JPanel panel = new JPanel();
		bottomPanel.add(panel, BorderLayout.SOUTH);
		panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));

		JButton btnNewButton = new JButton("清除");
		panel.add(btnNewButton);

		JButton sendMessage = new JButton("发送");
		sendMessage.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// 发送按钮回去发送文本框内的内容
				String message = sendMsg.getText();
				// 调用
				if (message != null && !message.equals("")) {
					// 调用sender 发送报文, 采用广播方式
					udpSender.sendMessage(message, broadcastAddress, defaultUDPServerPort);
					// 清空输入框
					sendMsg.setText("");
				}
			}
		});
		panel.add(sendMessage);

		//JPanel leftPanel = new JPanel();
		// splitPane.setLeftComponent(leftPanel);

		JPanel mainPanel = new JPanel();
		// leftPanel.add(mainPanel);
		mainPanel.setLayout(new BorderLayout(0, 0));
		splitPane.setLeftComponent(mainPanel);
		
		desktopLable = new JLabel();
		mainPanel.add(desktopLable, BorderLayout.CENTER);

		//
		this.addComponentListener(new ComponentListener() {

			public void componentResized(ComponentEvent e) {
				// TODO Auto-generated method stub
				splitPane.setDividerLocation(0.75);
				rightSplitPanel.setDividerLocation(0.60);
			}

			public void componentMoved(ComponentEvent e) {
				// TODO Auto-generated method stub

			}

			public void componentShown(ComponentEvent e) {
				// TODO Auto-generated method stub

			}

			public void componentHidden(ComponentEvent e) {
				// TODO Auto-generated method stub

			}
		});
	}

	private static void addPopup(Component component, final JPopupMenu popup) {
	}
}
发布了34 篇原创文章 · 获赞 54 · 访问量 5012

猜你喜欢

转载自blog.csdn.net/nosprings/article/details/103676937