#11 Capyor – Aplikacja dekstopowa

Teraz pora zająć się aplikacją desktopową, tak jak wspominałem wcześniej cały nasz projekt będzie się dzielił na dwie części pierwsza webowa druga dekstopowa.

Potrzebujemy aby nasza aplikacja wykonywała zrzuty ekranu o określonej lokalizacji, do tego wykorzystałem Swinga. Wiem, że jest on dość przestarzały lecz nie potrzebuję tutaj korzystać z jakichś jego zaawansowanych opcji. W teorii zasada działania programu wygląda tak, że tworzymy przezroczyste okienko na całą szerokość i wysokość ekranu użytkownika. Nasz użytkownik będzie mógł zaznaczyć określony obszar jaki go interesuje żeby zrobić screen. Wszystko to zapisujemy do pliku, który następnie uploadujemy na imgura (imgur dlatego, że ma dostępne api oraz hosting zdjęć jest praktycznie „dożywotni”. Obrazek jest wyświetlany na naszej aplikacji webowej gdzie użytkownik będzie mógł podzielić się screenem z innymi.

Tak prezentuje się kod, na pewno muszę go jeszcze trochę bardziej poukładać aby był czytelniejszy.

ublic class DrawingBoard extends JComponent {

	Rectangle recentagleCapture = new Rectangle();
	// ArrayLists that contain each shape drawn along with
	// that shapes stroke and fill
	Robot robot;
	Point drawStart, drawEnd;
	Date date = new Date();
	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
	File file = new File(("Screens/" + dateFormat.format(date) + ".png"));

	// Monitors events on the drawing area of the frame

	public DrawingBoard(JFrame DrawingBoard) {

		this.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {

				// When the mouse is pressed get x & y position
				drawStart = new Point(e.getX(), e.getY());
				drawEnd = drawStart;
				repaint();
			}

			public void mouseReleased(MouseEvent e) {

				// repaint the drawing area

				recentagleCapture = recentagle(drawStart.x, drawStart.y, e.getX(), e.getY());
				Screen.JFrame.dispose();

				if (recentagleCapture != null) {
					screenCapture();
					try {
						getImgurContent("changed");
					} catch (Exception e1) {
						e1.printStackTrace();
					}
				}

			}
		});

		this.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent e) {
				// Get the final x & y position after the mouse is dragged
				drawEnd = new Point(e.getX(), e.getY());
				repaint();
			}
		});
	}

	public void paint(Graphics g) {
		// Class used to define the recentagle to be drawn

		Graphics2D graphSettings = (Graphics2D) g;

		graphSettings.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

		graphSettings.setStroke(new BasicStroke(2));

		graphSettings.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));

		// Guide shape used for drawing
		if (drawStart != null && drawEnd != null) {
			// Makes the guide shape transparent

			graphSettings.setPaint(new Color(0, 0, 0, 50));

			// Create a new rectangle using x & y coordinates
			Shape aShape = drawRectangle(drawStart.x, drawStart.y, drawEnd.x, drawEnd.y);
			graphSettings.draw(aShape);
			graphSettings.fill(aShape);

		}
	}

	private Rectangle2D.Float drawRectangle(int x1, int y1, int x2, int y2) {
		// Get the top left hand corner for the shape
		// Math.min returns the points closest to 0

		int x = Math.min(x1, x2);
		int y = Math.min(y1, y2);

		// Gets the difference between the coordinates and

		int width = Math.abs(x1 - x2);
		int height = Math.abs(y1 - y2);

		return new Rectangle2D.Float(x, y, width, height);
	}

	private Rectangle recentagle(int x1, int y1, int x2, int y2) {
		// Get the top left hand corner for the shape
		// Math.min returns the points closest to 0

		int x = Math.min(x1, x2);
		int y = Math.min(y1, y2);

		// Gets the difference between the coordinates and

		int width = Math.abs(x1 - x2);
		int height = Math.abs(y1 - y2);

		return new Rectangle(x, y, width, height);
	}

	public void robotSetup() {
		try {
			robot = new Robot();

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

	public void screenCapture() {

		robotSetup();
		BufferedImage screen = robot.createScreenCapture(recentagleCapture);
		try {
			ImageIO.write(screen, "png", file);
		} catch (IOException ea) {
			ea.printStackTrace();
		}

	}

	public String getImgurContent(String clientID) throws Exception {
		URL url = new URL("https://api.imgur.com/3/image");
		HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();

		BufferedImage image = null;
		// read image
		image = ImageIO.read(file);
		ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
		ImageIO.write(image, "png", byteArray);
		byte[] byteImage = byteArray.toByteArray();
		String dataImage = Base64.encode(byteImage);
		String data = URLEncoder.encode("image", "UTF-8") + "=" + URLEncoder.encode(dataImage, "UTF-8");

		httpConnection.setDoOutput(true);
		httpConnection.setDoInput(true);
		httpConnection.setRequestMethod("POST");
		httpConnection.setRequestProperty("Authorization", "Client-ID " + clientID);
		httpConnection.setRequestMethod("POST");
		httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

		httpConnection.connect();
		StringBuilder stringBuilder = new StringBuilder();
		OutputStreamWriter wr = new OutputStreamWriter(httpConnection.getOutputStream());
		wr.write(data);
		wr.flush();

		// Get the response
		BufferedReader rd = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));
		String line;
		while ((line = rd.readLine()) != null) {
			if (line.contains("id")) {
			}
			stringBuilder.append(line).append("\n");
		}
		wr.close();
		rd.close();

		browserOpen(stringBuilder);

		return stringBuilder.toString();
	}

	public String imageUrl(String line) {
		String imageUrl = line;

		int indexImageUrl = imageUrl.indexOf("i.imgur.com") + 13;
		int dotIndex = imageUrl.substring(indexImageUrl).indexOf(".");
		return imageUrl.substring(indexImageUrl).substring(0, dotIndex);

	}

	public void browserOpen(StringBuilder stringBuilder) {
		StringBuilder websiteUrl = stringBuilder;
		try {

			java.awt.Desktop.getDesktop()
					.browse(java.net.URI.create("http://localhost:8080/" + imageUrl(websiteUrl.toString())));
		} catch (java.io.IOException e) {
			System.out.println(e.getMessage());
		}
	}
}
 
public class Screen extends JFrame {

	private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
	private int widthScreen = (int) screenSize.getWidth();
	private int heightScreen = (int) screenSize.getHeight();

	public int getWidthScreen() {
		return widthScreen;
	}

	public int getHeightScreen() {
		return heightScreen;
	}

	DrawingBoard drawingBoard = new DrawingBoard(JFrame);

	public static JFrame JFrame = new JFrame();

	JButton brushBut, lineBut, ellipseBut, rectBut, strokeBut, fillBut;

	Color strokeColor = Color.BLACK, fillColor = Color.BLACK;

	public static void main(String[] args) {
		new Screen();
	}

	public Screen() {

		// Void to close frame when clicking escape
		KeyListener keyAdapter = new KeyAdapter() {
			@Override

			// When someone click Escape program will be close
			public void keyPressed(KeyEvent evt) {
				if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
					System.exit(0);
				}
			}
		};
		// keylistener to checking when escape is clicking
		JFrame.addKeyListener(keyAdapter);

		// getting user monitor size and setting this to frame

		JFrame.setSize(widthScreen, heightScreen);
		// Undecorates the Window
		JFrame.setUndecorated(true);
		// color background
		JFrame.setBackground(new Color(0, 0, 0, 1));
		// frame must be visible
		JFrame.setVisible(true);

		JFrame.add(drawingBoard, BorderLayout.CENTER);

		// Show the frame

		JFrame.setVisible(true);

		// System.out.printltln(drawingBoard.drawEnd.getX());

	}
}

Z pewnością czeka mnie jeszcze wiele optymalizacji tak aby był jak najbardziej wydajny.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *