主頁 > 後端開發 > JDK安裝和環境變數配置(Win10圖文詳解)

JDK安裝和環境變數配置(Win10圖文詳解)

2020-11-20 00:29:03 後端開發

JDK的安裝和環境變數配置(Win10,圖文詳解)

  • 作業系統
  • JDK的安裝
    • JDK下載
  • 系統環境變數配置
  • 驗證JDK和環境變數配置
  • Eclipse安裝
  • Java小白入門專案代碼參考
  • 結語

作業系統

 Win10,64位作業系統

JDK的安裝

如何下載和安裝JDK,配置系統的環境變數,

JDK下載

登錄www.oracle.com下載
甲骨文官網:https://www.oracle.com/cn/index.html

甲骨文官網→資源→軟體下載→Java→面向開發人員的 Java (JDK)

→ JDK Download(這里是Java SE 15為例,可下最新版)

→下載Windows x64 Installer(找到自己對應作業系統的,本文win10,64位為例,點擊jdk-15.0.1_windows-x64_bin.exe)

→下載好jdk-15.0.1_windows-x64_bin.exe后點擊啟動

→無腦安裝,默認設定,(小白沒必要可以不改默認安裝路徑)安裝完畢關閉即可

1.甲骨文官網→資源 甲骨文官網

2.軟體下載
軟體下載

3.Java
Java

4.面向開發人員的 Java (JDK)
面向開發人員的 Java (JDK)

  1. JDK Download(這里是Java SE 15為例,可下最新版,最新版向下兼容,往下拉有更低的版本,有后面用到的JDK8版本)
    JDK Download(這里是Java SE 15為例,可下最新版)

6.下載Windows x64 Installer(找到自己對應作業系統的,本文win10,64位為例,點擊jdk-15.0.1_windows-x64_bin.exe),現在一般都是Window的64位作業系統,詳細看自己電腦屬性,
在這里插入圖片描述

7.下載好jdk-15.0.1_windows-x64_bin.exe后點擊啟動,下載好后去自己瀏覽器的下載找到已經下載好的jdk,點擊安裝就行了,默認設定,

在這里插入圖片描述

8.無腦安裝,默認設定,(小白沒必要的話建議不改默認安裝路徑)安裝完畢關閉即可,最好使用默認路徑,后邊系統環境變數要用,不推薦改,安裝完點關閉就可以了
在這里插入圖片描述
在這里插入圖片描述

系統環境變數配置

1.找到環境變數:
檔案→此電腦→右鍵打開屬性→高級系統設定→環境變數
(實在找不到,直接在win10的搜索框搜索)
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
1.配置JAVA_HOME環境變數

  1. 點擊下面系統變數的新建(不是用戶變數!

  2. 變數名填 JAVA_HOME

  3. 變數值填C:\ProgramFiles\Java\jdk-15.0.1

    (注意:這是我的jdk版本,你要選著自己的jdk安裝路徑,如果上面是安裝默認的話,去C盤,ProgramFiles,Java,里面的你自己的jdk安裝路徑,也可以點瀏覽目錄,選擇jdk檔案夾確定就行了,)

    點擊確定,

在這里插入圖片描述

在這里插入圖片描述

2.配置Path環境變數

  1. 在系統變數找到Path
  2. 雙擊Path
  3. 進去后點擊右上角的新建
  4. 在輸入框中輸入%JAVA_HOME%\bin
  5. 再次點擊新建,輸入%JAVA_HOME%\jre\bin
  6. 點確認

在系統變數找到Path,雙擊Path
在這里插入圖片描述
3.進去后點擊右上角的新建
在這里插入圖片描述

4.在輸入框中輸入%JAVA_HOME%\bin

輸入完記得點確定
在這里插入圖片描述
5.再次點擊新建(也可以重新雙擊Path),輸入%JAVA_HOME%\jre\bin

點確定
在這里插入圖片描述
3.配置CLASSPATH環境變數

  1. 打開環境變數,點擊下面系統變數的新建(不是用戶變數!
  2. 變數名填CLASSPATH
  3. 變數值填
    .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;

4.注意.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;這段變數值前面是有一個小點符號“.”和一個分號的“;” 不要漏掉,記得點確認,就配置好了,

在這里插入圖片描述
配置好后出現變數和值
在這里插入圖片描述

驗證JDK和環境變數配置

  1. 使用快捷鍵win+R打開視窗,輸入cmd命令,按Enter鍵進入cmd命令列視窗,
    在這里插入圖片描述
    2.輸入java命令,按Enter執行,

在這里插入圖片描述
出現這些java使用說明,那么你的環境變數就配置成功了,

3.輸入javac命令,按Enter執行,
在這里插入圖片描述
環境變數配置成功,

下面展示一些 行內代碼片

Eclipse安裝

配置好環境變數后,直接下載Eclipse安裝包,默認設定安裝即可,
eclipse-java-2020-09-R-win32-x86_64
這里不詳細介紹,可以自行百度一下,

Java小白入門專案代碼參考

一起畫一畫入門實戰代碼參考

javax.swing.JFrame類

package com.mr.draw;

import javax.swing.JFrame;//引入視窗類,如果不含類,先把module-info.java刪掉
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;//子類具有可訪問影像資料緩沖區的image
import java.awt.event.MouseAdapter;//滑鼠監聽事件
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;//空類
import java.awt.BorderLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import java.awt.BasicStroke;//按鈕
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JColorChooser;//顏色
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import com.mr.util.FrameGetShape;
import com.mr.util.ShapeWindow;
import com.mr.util.Shapes;
import com.mr.util.DrawImageUtil;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import java.awt.AlphaComposite;
import java.awt.Font;
import javax.swing.JOptionPane;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;//常用
import java.awt.Cursor;

public class DrawPictureFrame extends JFrame implements FrameGetShape { // 繼承視窗類
	// 創建一個8位BGR顏色分量影像
	BufferedImage image = new BufferedImage(570, 390, BufferedImage.TYPE_INT_BGR);
	Graphics gs = image.getGraphics();// 獲得影像的繪制物件
	Graphics2D g = (Graphics2D) gs;// 將繪圖物件轉換成Graphics2D型別
	DrawPictureCanvas canvas = new DrawPictureCanvas();// 創建畫布物件
	Color foreColor = Color.BLACK;// 定義前景色
	Color backgroundColor = Color.WHITE;// 定義背景色
	int x = -1; // 上一次滑鼠繪制點的橫坐標
	int y = -1; // 上一次滑鼠繪制點的縱坐標
	boolean rubber = false; // 橡皮標識變數
	private JToolBar toolBar;// 工具列
	private JButton eraserButton;// 橡皮按鈕
	private JToggleButton strokeButton1;// 細線按鈕
	private JToggleButton strokeButton2;// 粗線按鈕
	private JToggleButton strokeButton3;// 較粗按鈕
	private JButton backgroundButton;// 背景色按鈕
	private JButton foregroundButton;// 前景色按鈕
	private JButton clearButton;// 清除按鈕
	private JButton saveButton;// 保存按鈕
	private JButton shapeButton;// 圖形按鈕
	boolean drawShape = false;
	Shapes shape;
	private JMenuItem strokeMenuItem1;// 細線選單
	private JMenuItem strokeMenuItem2;// 粗線選單
	private JMenuItem strokeMenuItem3;// 較粗選單
	private JMenuItem clearMenuItem;// 清除選單
	private JMenuItem foregroundMenuItem;// 前景色選單
	private JMenuItem backgroundMenuItem;// 背景色選單
	private JMenuItem eraserMenuItem;// 橡皮選單
	private JMenuItem exitMenuItem;// 退出選單
	private JMenuItem saveMenuItem;// 保存選單
	private JMenuItem shuiyinMenuItem;// 水印 選單
	private String shuiyin = "";// 水印字符內容
	private PictureWindow picWindow;// 簡筆畫展示表單
	private JButton showPicButton;// 展開簡筆畫按鈕

	public DrawPictureFrame() { // 構造組件初始化方法
		setResizable(false);// 表單大小不變
		setTitle("畫圖程式(水印內容:[" + shuiyin + "])");// 標題
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 表單關閉則停止程式
		setBounds(500, 100, 574, 460);// 設定視窗位置和寬高

		init();// 組件初始化
		addListener();// 添加組件監聽
	}// DrawPictureFrame()結束

	private void init() {
		g.setColor(backgroundColor); // 用背景色設定繪圖物件的顏色
		g.fillRect(0, 0, 570, 390); // 用背景色填充整個畫布
		g.setColor(foreColor); // 用前景色設定繪圖物件的顏色
		canvas.setImage(image); // 設定畫布的影像
		getContentPane().add(canvas);

		toolBar = new JToolBar();// 初始化工具列
		getContentPane().add(toolBar, BorderLayout.NORTH);// 工具列添加到表單最北位置
		showPicButton = new JButton("展開簡筆畫");// 初始化按鈕物件,并添加文本內容
		toolBar.add(showPicButton);// 工具列添加按鈕
		saveButton = new JButton("保存");// 初始化按鈕物件,并添加文本內容
		toolBar.add(saveButton);// 工具列添加按鈕
		toolBar.addSeparator();// 添加分割條
		// 初始化有選中狀態的按鈕物件,并添加文本內容
		strokeButton1 = new JToggleButton("細線");
		strokeButton1.setSelected(true);// 細線按鈕處于被選中狀態
		toolBar.add(strokeButton1);// 工具列添加按鈕
		// 初始化有選中狀態的按鈕物件,并添加文本內容
		strokeButton2 = new JToggleButton("粗線");
		toolBar.add(strokeButton2);// 工具列添加按鈕
		// 初始化有選中狀態的按鈕物件,并添加文本內容
		strokeButton3 = new JToggleButton("較粗");
		// 畫筆粗細按鈕組,保證同時只有一個按鈕被選中
		ButtonGroup strokeGroup = new ButtonGroup();
		strokeGroup.add(strokeButton1);// 按鈕組添加按鈕
		strokeGroup.add(strokeButton2);// 按鈕組添加按鈕
		strokeGroup.add(strokeButton3);// 按鈕組添加按鈕
		toolBar.add(strokeButton3);// 工具列添加按鈕
		toolBar.addSeparator();// 添加分割
		backgroundButton = new JButton("背景顏色");// 初始化按鈕物件,并添加文本內容
		toolBar.add(backgroundButton);// 工具列添加按鈕
		foregroundButton = new JButton("前景顏色");// 初始化按鈕物件,并添加文本內容
		toolBar.add(foregroundButton);// 工具列添加按鈕
		toolBar.addSeparator();// 添加分割條
		shapeButton = new JButton("圖形");
		toolBar.add(shapeButton);
		clearButton = new JButton("清 除");// 初始化按鈕物件,并添加文本內容
		toolBar.add(clearButton);// 工具列添加按鈕
		eraserButton = new JButton("橡皮");// 初始化按鈕物件,并添加文本內容
		toolBar.add(eraserButton);// 工具列添加按鈕
		JMenuBar menuBar = new JMenuBar();// 創建選單欄
		setJMenuBar(menuBar);// 表單載入選單欄

		JMenu systemMenu = new JMenu("系統");// 初始化選單物件,并添加文本內容
		menuBar.add(systemMenu);// 選單欄添加選單物件
		shuiyinMenuItem = new JMenuItem("設定水印");// 初始化選單項物件,并添加文本內容
		systemMenu.add(shuiyinMenuItem);// 選單添加選單項
		saveMenuItem = new JMenuItem("保存");// 初始化選單項物件,并添加文本內容
		systemMenu.add(saveMenuItem);// 選單添加選單項
		systemMenu.addSeparator();// 添加分割條
		exitMenuItem = new JMenuItem("退出");// 初始化選單項物件,并添加文本內容
		systemMenu.add(exitMenuItem);// 選單添加選單項
		JMenu strokeMenu = new JMenu("線型");// 初始化選單物件,并添加文本內容
		menuBar.add(strokeMenu);// 選單欄添加選單物件
		strokeMenuItem1 = new JMenuItem("細線");// 初始化選單項物件,并添加文本內容
		strokeMenu.add(strokeMenuItem1);// 選單添加選單項
		strokeMenuItem2 = new JMenuItem("粗線");// 初始化選單項物件,并添加文本內容
		strokeMenu.add(strokeMenuItem2);// 選單添加選單項
		strokeMenuItem3 = new JMenuItem("較粗");// 初始化選單項物件,并添加文本內容
		strokeMenu.add(strokeMenuItem3);// 選單添加選單項

		JMenu colorMenu = new JMenu("顏色");// 初始化選單物件,并添加文本內容
		menuBar.add(colorMenu);// 選單欄添加選單物件
		foregroundMenuItem = new JMenuItem("前景顏色");// 初始化選單項物件,并添加文本內容
		colorMenu.add(foregroundMenuItem);// 選單添加選單項
		backgroundMenuItem = new JMenuItem("背景顏色");// 初始化選單項物件,并添加文本內容
		colorMenu.add(backgroundMenuItem);// 選單添加選單項

		JMenu editMenu = new JMenu("編輯");// 初始化選單物件,并添加文本內容
		menuBar.add(editMenu);// 選單欄添加選單物件
		clearMenuItem = new JMenuItem("清除");// 初始化選單項物件,并添加文本內容
		editMenu.add(clearMenuItem);// 選單添加選單項
		eraserMenuItem = new JMenuItem("橡皮");// 初始化選單項物件,并添加文本內容
		editMenu.add(eraserMenuItem);// 選單添加選單項

		// 創建簡筆畫展示面板,并將本類當作它的父表單
		picWindow = new PictureWindow(DrawPictureFrame.this);

	}

	private void addListener() {
		// 畫板添加滑鼠移動事件監聽
		canvas.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(final MouseEvent e) {// 當滑鼠拖曳時
				if (x > 0 && y > 0) {// 如果x和y存在滑鼠記錄
					if (rubber) {// 橡皮標識為true,表示使用橡皮
						g.setColor(backgroundColor); // 繪圖工具使用背景色
						g.fillRect(x, y, 10, 10); // 在滑鼠劃過的位置畫填充的正方型
					} else { // 如果橡皮標識為false,表示用畫筆畫圖
						g.drawLine(x, y, e.getX(), e.getY());// 在鼠滑過的位置畫直線
					} // else結束
				} // if結束
				x = e.getX(); // 上一次滑鼠繪制點的橫坐標
				y = e.getY(); // 上一次滑鼠繪制點的縱坐標
				canvas.repaint(); // 更新畫布
			}// mouseDragged()結束

			public void mouseMoved(final MouseEvent arg0) {// 當滑鼠移動時
				if (rubber) {// 如果使用橡皮
					// 設定滑鼠指標的形狀為圖片
					Toolkit kit = Toolkit.getDefaultToolkit();// 獲得系統默認的組件工具包
					// 利用工具包獲取圖片
					Image img = kit.createImage("src/img/icon/滑鼠橡皮.png");
					// 利用工具包創建一個自定義的游標物件
					// 引數為圖片,游標熱點(寫成0,0就行)和游標描述字串
					Cursor c = kit.createCustomCursor(img, new Point(0, 0), "clear");
					setCursor(c);// 使用自定義的游標
				} else {
					// 設定滑鼠指標的形狀為十字游標
					setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
				} // else結束
			}// mouseMoved()結束
		});// canvas.addMouseMotionListener()結束
		canvas.addMouseListener(new MouseAdapter() {// 畫板添加滑鼠單擊事件監聽
			public void mouseReleased(final MouseEvent arg0) {// 當按鍵抬起時
				x = -1; // 將記錄上一次滑鼠繪制點的橫坐標恢復成-1
				y = -1; // 將記錄上一次滑鼠繪制點的縱坐標恢復成-1
			}// mouseReleased()結束

			public void mousePressed(MouseEvent e) {// 當按鍵按下時
				if (drawShape) {// 如果此時滑鼠畫的是圖形
					switch (shape.getType()) {// 判斷圖形的種類
					case Shapes.YUAN:// 如果是圓形
						// 計算坐標,讓滑鼠處于圖形的中心位置
						int yuanX = e.getX() - shape.getWidth() / 2;
						int yuanY = e.getY() - shape.getHeigth() / 2;
						// 創建圓形圖形,并指定坐標和寬高
						Ellipse2D yuan = new Ellipse2D.Double(yuanX, yuanY, shape.getWidth(), shape.getHeigth());
						g.draw(yuan);// 畫圖工具畫此圓形
						break;// 結束switch陳述句
					case Shapes.FANG:// 如果是方形
						// 計算坐標,讓滑鼠處于圖形的中心位置
						int fangX = e.getX() - shape.getWidth() / 2;
						int fangY = e.getY() - shape.getHeigth() / 2;
						// 創建方形圖形,并指定坐標和寬高
						Rectangle2D fang = new Rectangle2D.Double(fangX, fangY, shape.getWidth(), shape.getHeigth());
						g.draw(fang);// 畫圖工具畫此方形
						break;// 結束switch陳述句
					}// switch結束
					canvas.repaint(); // 更新畫布
					drawShape = false;
				} // if結束
			}// mousePressed()結束
		});// canvas.addMouseListener()結束

		toolBar.addMouseMotionListener(new MouseMotionAdapter() {// 工具列添加滑鼠移動監聽
			public void mouseMoved(final MouseEvent arg0) {// 當滑鼠移動時
				// 設定滑鼠指標的形狀為默認游標
				setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
			}// mouseMoved()
		});// toolBar.addMouseMotionListener()結束

		strokeButton1.addActionListener(new ActionListener() {// “細線”按鈕添加動作監聽
			public void actionPerformed(final ActionEvent arg0) {// 單擊時
				// 宣告畫筆的屬性,粗細為1像素,線條末端無修飾,折線處呈尖角
				BasicStroke bs = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
				g.setStroke(bs); // 畫圖工具使用此畫筆
			}// actionPerformed()結束
		});// strokeButton1.addActionListener()結束

		strokeButton2.addActionListener(new ActionListener() {// “粗線”按鈕添加動作監聽
			public void actionPerformed(final ActionEvent arg0) {
				// 宣告畫筆的屬性,粗細為2像素,線條末端無修飾,折線處呈尖角
				BasicStroke bs = new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
				g.setStroke(bs); // 畫圖工具使用此畫筆
			}// actionPerformed()結束
		});// strokeButton2.addActionListener()結束

		strokeButton3.addActionListener(new ActionListener() {// “較粗”按鈕添加動作監聽
			public void actionPerformed(final ActionEvent arg0) {
				// 宣告畫筆的屬性,粗細為4像素,線條末端無修飾,折線處呈尖角
				BasicStroke bs = new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
				g.setStroke(bs); // 畫圖工具使用此畫筆
			}// actionPerformed()結束
		});// strokeButton3.addActionListener()結束

		backgroundButton.addActionListener(new ActionListener() {// 背景顏色按鈕添加動作監聽
			public void actionPerformed(final ActionEvent arg0) {// 單擊時
				// 打開選擇顏色對話框,引數依次為:父表單、標題、默認選中的顏色(青色)
				Color bgColor = JColorChooser.showDialog(DrawPictureFrame.this, "選擇顏色對話框", Color.CYAN);
				if (bgColor != null) {// 如果選中的顏色不是空的
					backgroundColor = bgColor;// 將選中的顏色賦給背景色變數
				}
				// 背景色按鈕的也更換為這種背景顏色
				backgroundButton.setBackground(backgroundColor);
				g.setColor(backgroundColor); // 繪圖工具使用背景色
				g.fillRect(0, 0, 570, 390); // 畫一個背景顏色的方形填滿整個畫布
				g.setColor(foreColor); // 繪圖工具使用前景色
				canvas.repaint(); // 更新畫布
			}// actionPerformed()結束
		});// backgroundButton.addActionListener()結束

		foregroundButton.addActionListener(new ActionListener() {// 前景色顏色按鈕添加動作監聽
			public void actionPerformed(final ActionEvent arg0) {// 單擊時
				// 打開選擇顏色對話框,引數依次為:父表單、標題、默認選中的顏色(青色)
				Color fColor = JColorChooser.showDialog(DrawPictureFrame.this, "選擇顏色對話框", Color.CYAN);
				if (fColor != null) {// 如果選中的顏色不是空的
					foreColor = fColor;// 將選中的顏色賦給前景色變數
				}
				// 前景色按鈕的文字也更換為這種顏色
				foregroundButton.setForeground(foreColor);
				g.setColor(foreColor); // 繪圖工具使用前景色
			}// actionPerformed()結束
		});// foregroundButton.addActionListener()結束

		clearButton.addActionListener(new ActionListener() {// 清除按鈕添加動作監聽
			public void actionPerformed(final ActionEvent arg0) {// 單擊時
				g.setColor(backgroundColor); // 繪圖工具使用背景色
				g.fillRect(0, 0, 570, 390); // 畫一個背景顏色的方形填滿整個畫布
				g.setColor(foreColor); // 繪圖工具使用前景色
				canvas.repaint(); // 更新畫布
			}// actionPerformed()結束
		});// eraserButton.addActionListener()結束

		eraserButton.addActionListener(new ActionListener() {// 橡皮按鈕添加動作監聽
			public void actionPerformed(final ActionEvent arg0) {// 單擊時
				// 單擊工具列上的橡皮按鈕,使用橡皮
				if (eraserButton.getText().equals("橡皮")) {
					rubber = true; // 設定橡皮標識為true
					eraserButton.setText("畫圖"); // 改變按鈕上顯示的文本為畫圖
				} else { // 單擊工具列上的畫圖按鈕,使用畫筆
					rubber = false; // 設定橡皮標識為false
					eraserButton.setText("橡皮"); // 改變按鈕上顯示的文本為橡皮
					g.setColor(foreColor); // 設定繪圖物件的前景色
				} // else結束
			}// actionPerformed()結束
		});// eraserButton.addActionListener()結束

		shapeButton.addActionListener(new ActionListener() {// 圖形按鈕添加動作監聽
			public void actionPerformed(ActionEvent e) {// 單擊時
				// 創建圖形選擇組件
				ShapeWindow shapeWindow = new ShapeWindow(DrawPictureFrame.this);
				int shapeButtonWidth = shapeButton.getWidth();// 獲取影像按鈕寬度
				int shapeWindowWidth = shapeWindow.getWidth();// 獲取圖形按鈕高度
				int shapeButtonX = shapeButton.getX();// 獲取圖形按鈕橫坐標
				int shapeButtonY = shapeButton.getY();// 獲取圖形按鈕縱坐標
				// 計算圖形組件橫坐標,讓組件與“圖形”按鈕居中對齊
				int shapeWindowX = getX() + shapeButtonX - (shapeWindowWidth - shapeButtonWidth) / 2;
				// 計算圖形組件縱坐標,讓組件顯示在“圖形”按鈕下方
				int shapeWindowY = getY() + shapeButtonY + 80;
				// 設定圖形組件坐標位置
				shapeWindow.setLocation(shapeWindowX, shapeWindowY);
				shapeWindow.setVisible(true);// 圖形組件可見
			}// actionPerformed()結束
		});// shapeButton.addActionListener()結束

		saveButton.addActionListener(new ActionListener() {// 保存按鈕添加動作監聽
			public void actionPerformed(final ActionEvent arg0) {// 單擊時
				addWatermark();// 添加水印
				DrawImageUtil.saveImage(DrawPictureFrame.this, image);// 列印圖片
			}
		});

		exitMenuItem.addActionListener(new ActionListener() { // 退出選單欄添加動作監聽
			public void actionPerformed(final ActionEvent e) { // 單擊時
				System.exit(0); // 程式關閉
			}/// actionPerformed()結束
		});// exitMenuItem.addActionListener()結束
		eraserMenuItem.addActionListener(new ActionListener() { // 橡皮選單欄添加動作監聽
			public void actionPerformed(final ActionEvent e) { // 單擊時
				if (eraserMenuItem.getText().equals("橡皮")) { // 如果選單的文字內容為“橡皮”
					rubber = true; // 設定橡皮標識為true
					eraserMenuItem.setText("畫圖"); // 改變選單上顯示的文本為畫圖
					eraserButton.setText("畫圖"); // 改變按鈕上顯示的文本為畫圖
				} else { // 單擊工具列上的畫圖按鈕,使用畫筆
					rubber = false; // 設定橡皮標識為false
					eraserMenuItem.setText("橡皮"); // 改變選單上顯示的文本為“橡皮”
					eraserButton.setText("橡皮"); // 改變按鈕上顯示的文本為“橡皮”
					g.setColor(foreColor); // 設定繪圖物件的前景色
				} // else結束
			}// actionPerformed()結束
		});// eraserMenuItem.addActionListener()結束
		clearMenuItem.addActionListener(new ActionListener() { // 清除選單添加動作監聽
			public void actionPerformed(final ActionEvent e) { // 單擊時
				g.setColor(backgroundColor); // 繪圖工具使用背景色
				g.fillRect(0, 0, 570, 390); // 畫一個背景顏色的方形填滿整個畫布
				g.setColor(foreColor); // 繪圖工具使用前景色
				canvas.repaint(); // 更新畫布
			}// actionPerformed()結束
		});// clearMenuItem.addActionListener()結束
		strokeMenuItem1.addActionListener(new ActionListener() {// "細線"選單添加動作監聽
			public void actionPerformed(final ActionEvent e) { // 單擊時
				// 宣告畫筆的屬性,粗細為1像素,線條末端無修飾,折線處呈尖角
				BasicStroke bs = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
				g.setStroke(bs); // 畫圖工具使用此畫筆
				strokeButton1.setSelected(true); // "細線"按鈕設為選中狀態
			}// actionPerformed()結束
		});// strokeMenuItem1.addActionListener()結束
		strokeMenuItem2.addActionListener(new ActionListener() {// "粗線"選單添加動作監聽
			public void actionPerformed(final ActionEvent e) { // 單擊時
				// 宣告畫筆的屬性,粗細為2像素,線條末端無修飾,折線處呈尖角
				BasicStroke bs = new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
				g.setStroke(bs); // 畫圖工具使用此畫筆
				strokeButton2.setSelected(true); // "粗線"按鈕設為選中狀態
			}// actionPerformed()結束
		});// strokeMenuItem2.addActionListener()結束
		strokeMenuItem3.addActionListener(new ActionListener() {// "較粗"選單添加動作監聽
			public void actionPerformed(final ActionEvent e) { // 單擊時
				// 宣告畫筆的屬性,粗細為4像素,線條末端無修飾,折線處呈尖角
				BasicStroke bs = new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
				g.setStroke(bs); // 畫圖工具使用此畫筆
				strokeButton3.setSelected(true); // "較粗"按鈕設為選中狀態
			}// actionPerformed()結束
		});// strokeMenuItem3.addActionListener()結束
		foregroundMenuItem.addActionListener(new ActionListener() {// 前景色選單添加動作監聽
			public void actionPerformed(final ActionEvent e) { // 單擊時
				// 打開選擇顏色對話框,引數依次為:父表單、標題、默認選中的顏色(青色)
				Color fColor = JColorChooser.showDialog(DrawPictureFrame.this, "選擇顏色對話框", Color.CYAN);
				if (fColor != null) { // 如果選中的顏色不是空的
					foreColor = fColor; // 將選中的顏色賦給前景色變數
				} // if結束
				foregroundButton.setForeground(foreColor);// 前景色按鈕的文字也更換為這種顏色
				g.setColor(foreColor); // 繪圖工具使用前景色
			}// actionPerformed()結束
		});// foregroundMenuItem.addActionListener()結束
		backgroundMenuItem.addActionListener(new ActionListener() {// 背景色選單添加動作監聽
			public void actionPerformed(final ActionEvent e) { // 單擊時
				// 打開選擇顏色對話框,引數依次為:父表單、標題、默認選中的顏色(青色)
				Color bgColor = JColorChooser.showDialog(DrawPictureFrame.this, "選擇顏色對話框", Color.CYAN);
				if (bgColor != null) { // 如果選中的顏色不是空的
					backgroundColor = bgColor; // 將選中的顏色賦給背景色變數
				} // if結束
					// 背景色按鈕更改按鈕自身的背景顏色,其顏色與畫板背景顏色相同
				backgroundButton.setBackground(backgroundColor);
				g.setColor(backgroundColor); // 繪圖工具使用背景色
				g.fillRect(0, 0, 570, 390); // 畫一個背景顏色的方形填滿整個畫布
				g.setColor(foreColor); // 繪圖工具使用前景色
				canvas.repaint(); // 更新畫布
			}// actionPerformed()結束
		});// backgroundMenuItem.addActionListener()結束
		saveMenuItem.addActionListener(new ActionListener() { // 保存選單添加動作監聽
			public void actionPerformed(ActionEvent e) { // 單擊時
				addWatermark();// 添加水印

				DrawImageUtil.saveImage(DrawPictureFrame.this, image);// 列印圖片
			}// actionPerformed()結束
		});// saveMenuItem.addActionListener()結束

		shuiyinMenuItem.addActionListener(new ActionListener() {// 水印選單項添加動作監聽
			public void actionPerformed(ActionEvent e) {// 單擊時
				// 彈出輸入對話框
				shuiyin = JOptionPane.showInputDialog(DrawPictureFrame.this, "你想添加什么水印?");
				if (null == shuiyin) {// 如果輸入對話框回傳的是null
					shuiyin = "";// 字串設為空內容
				} else {// 如果不是null
					setTitle("畫圖程式(水印內容:[ " + shuiyin + " ] )");// 修改表單標題
				} // else結束
			}// actionPerformed()結束
		});// shuiyinMenuItem.addActionListener()結束

		showPicButton.addActionListener(new ActionListener() {// 展示簡筆畫按鈕添加動作監聽
			public void actionPerformed(ActionEvent e) {// 單擊時
				boolean isVisible = picWindow.isVisible();// 獲取簡筆畫展示表單可見狀態
				if (isVisible) {// 如果簡筆畫展示表單是可見的
					showPicButton.setText("展開簡筆畫");// 修改按鈕的文本
					picWindow.setVisible(false);// 隱藏簡筆畫展示表單
				} else {// 如果是隱藏的
					showPicButton.setText("隱藏簡筆畫");// 修改按鈕的文本
					// 重新指定簡筆畫展示表單的顯示位置
					// 橫坐標 = 主表單橫坐標 - 簡筆畫表單寬度 - 5
					// 縱坐標 = 主表單縱坐標
					picWindow.setLocation(getX() - picWindow.getWidth() - 5, getY());
					picWindow.setVisible(true);// 簡筆畫展示表單可見
				} // else結束
			}// actionPerformed()結束
		});// showPicButton.addActionListener()結束

	}// addListener()結束

	/**
	 * 恢復展開簡筆畫按鈕的文本內容,此方法供簡筆畫面板的“隱藏”按鈕呼叫,
	 */
	public void initShowPicButton() {
		showPicButton.setText("展開簡筆畫");// 修改按鈕的文本
	}// initShowPicButton()結束

	private void addWatermark() {
		if (!"".equals(shuiyin.trim())) {// 如果水印欄位不是空字串
			g.rotate(Math.toRadians(-30));// 將圖片旋轉-30弧度
			Font font = new Font("楷體", Font.BOLD, 60);// 設定字體
			g.setFont(font);// 載入字體
			g.setColor(Color.GRAY);// 使用灰色
			AlphaComposite alpha = AlphaComposite.SrcOver.derive(0.4f);// 設定透明效果
			g.setComposite(alpha);// 使用透明效果
			g.drawString(shuiyin, 150, 500);// 繪制文字
			canvas.repaint();// 面板重繪
			g.rotate(Math.toRadians(30));// 將旋轉的圖片再轉回來
			alpha = AlphaComposite.SrcOver.derive(1f);// 不透明效果
			g.setComposite(alpha);// 使用不透明效果
			g.setColor(foreColor);// 畫筆恢復之前顏色
		} // if結束s
	}// addWatermark()結束

	public void getShape(Shapes shape) {
		this.shape = shape;// 將回傳的圖形物件付給類的全域變數
		drawShape = true;// 畫圖形標識變數為true,說明現在滑鼠畫的是圖形,而不是線
	}// getShape()結束

	public static void main(String[] args) {
		DrawPictureFrame frame = new DrawPictureFrame();// 創建表單物件
		frame.setVisible(true);// 讓表單可見
	}// main結束
}// DrawPictureFrame類 結束

DrawPictureCanvas類

package com.mr.draw;

import java.awt.Canvas;//畫板類
import java.awt.Graphics;//繪圖類
import java.awt.Image;//影像類

public class DrawPictureCanvas extends Canvas {
	private Image image = null;// 創建畫板中圖片物件

	public void setImage(Image image) {
		this.image = image;// Ctrl+Shift+S 快捷 Generate Get Set
	}

	public void paint(Graphics g) { // 重寫 paint方法
		g.drawImage(image, 0, 0, null);// 在畫布繪圖
	}

	public void update(Graphics g) { // 重寫 update方法 解決螢屏閃爍
		paint(g);
	}
}//DrawPictureCanvas類結束

PictureWindow類

package com.mr.draw;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JWindow;
import com.mr.util.BackgroundPanel;

/**
 * 簡筆畫展示表單
*/
public class PictureWindow extends JWindow {
	private JButton changeButton;// 更換圖片按鈕
	private JButton hiddenButton;// 隱藏按鈕
	private BackgroundPanel centerPanel;// 展示圖片的帶背景圖面板
	File list[ ];// 圖片檔案陣列
	int index;// 當前選中的圖片索引
	DrawPictureFrame frame;// 父表單

	/**
	 * 構造方法
	 * 
	 * @param frame - 父表單
	 */
	public PictureWindow(DrawPictureFrame frame) {
		this.frame = frame;// 構造引數的值賦給父表單
		setSize(400, 460);// 設定表單寬高
		init();// 初始化表單組件
		addListener();// 給組件添加監聽
	}// PictureWindow()結束

	/**
	 * 組件初始化方法
	 */
	private void init() {
		Container c = getContentPane();// 獲取表單主容器
		File dir = new File("src/img/picture");// 創建簡筆畫素材檔案夾物件
		list = dir.listFiles();// 獲取檔案夾里的所有檔案
		// 初始化背景面板,使用圖片檔案夾里第一張簡筆畫
		centerPanel = new BackgroundPanel(getListImage());
		c.add(centerPanel, BorderLayout.CENTER);// 背景面板放到主容器中部

		FlowLayout flow = new FlowLayout(FlowLayout.RIGHT);// 創建右對齊的流布局
		flow.setHgap(20);// 水平間隔20像素
		JPanel southPanel = new JPanel();// 創建南部面板
		southPanel.setLayout(flow);// 南部面板使用剛才創建好的流布局
		changeButton = new JButton("更換圖片");// 實體化“更換圖片”按鈕
		southPanel.add(changeButton);// 南部面板添加按鈕
		hiddenButton = new JButton("隱藏");// 實體化“隱藏”按鈕
		southPanel.add(hiddenButton);// 南部面板添加按鈕
		c.add(southPanel, BorderLayout.SOUTH);// 南部面板放到主容器的南部位置
	}// init()結束

	/**
	 * 添加監聽
	 */
	private void addListener() {
		hiddenButton.addActionListener(new ActionListener() {// 隱藏按鈕添加動作監聽
			public void actionPerformed(ActionEvent e) {// 單擊時
				setVisible(false);// 本表單不可見
				frame.initShowPicButton();//父類表單還原簡筆畫按鈕文本
			}// actionPerformed();
		});// hiddenButton.addActionListener()結束
		changeButton.addActionListener(new ActionListener() {// 更換圖片按鈕添加動作監聽
			public void actionPerformed(ActionEvent e) {// 單擊時
				centerPanel.setImage(getListImage());// 背景面板重新載入圖片
			}// actionPerformed();
		});// changeButton.addActionListener()結束
	}// addListener()

	/**
	 * 獲取圖片檔案夾下的圖片,每次呼叫此方法,都會獲得不同的檔案物件
	 * 
	 * @return 回傳圖片物件
	 */
	private Image getListImage() {
		String imgPath = list[index].getAbsolutePath();// 獲取當前索引下的圖片檔案路徑
		ImageIcon image = new ImageIcon(imgPath);// 獲取此圖片檔案的圖示物件
		index++;// 索引變數遞增
		if (index >= list.length) {// 如果索引變數超過圖片數量了
			index = 0;// 索引變數歸零
		} // if結束
		return image.getImage();// 獲得圖示物件的圖片物件
	}// getListImage()結束
}// PictureWindow類結束

后續將更新,如何將在eclipse中寫的java專案匯出打包成,exe類檔案,在沒有非JVM的環境下執行,直接打包成安裝包,在其它windows電腦安裝運行,

結語

第一次在CSDN寫東西 ,這些也是我自己最近遇到的問題,和一些解決的方法經驗,希望對你們有幫助,也可以記錄自己的一些經驗和成長,

有志者,事竟成,破釜沉舟,百二秦關終屬楚;
有心人,天不負,臥薪嘗膽,三千越甲可吞吳,

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/225089.html

標籤:java

上一篇:專案

下一篇:springboot與mybatis的事務問題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more