java畫板,java實現畫板

本文目錄一覽:

用java畫板drawString的字,可以改變大小嗎

可以,用Graphics類的void setFont(Font font)方法來,設定字體的名稱,大小,是否加粗斜體等.

例如 Font f=new Font(null,Font.PLAIN,20);用這個語句定義一個缺省字體名稱大小20磅的普通字體對象f,然後用g.setFont(f);為圖形對象Graphics g設定字體大小,畫板drawString的字體大小就會改變了.

java畫板

//有問題的話,給我發百度消息

import java.awt.Color;

import java.awt.Cursor;

import java.awt.Graphics;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.util.LinkedList;

import java.util.List;

import javax.swing.JFrame;

import javax.swing.JPanel;

/**功能介紹

* 1.改變線條長度時鼠標形狀的改變(鼠標位於線條兩端時,四種鼠標狀態)

* 2.移動線條時鼠標形狀的改變(鼠標位於線條中間)

* 3.刪除時鼠標形狀的改變

* 4.最後一條直線顏色的不同

* 5.最大化、最小化、窗口大小改變時,線條的重繪

*

*/

public class LineDraw extends JFrame{

/**

*我需要在一個背景下能在任意位置添加線條,

能通過鼠標左鍵拉長,並且如果當鼠標點到直線中央時能拖動線條,當用鼠標右鍵點擊直線時直線能消失。

*/

private LineDrawPanel drawPanel=new LineDrawPanel();

public static void main(String[] args) {

new LineDraw(“畫圖面板”);

}

public LineDraw(String title) {

super(title);

setBounds(300, 100, 500, 400);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

add(drawPanel);

validate();

}

}

class LineDrawPanel extends JPanel{

private int x1;

private int y1;

private Line lastLine;//最後一條線,也是當前正在畫的線,注意線的顏色

private boolean isDrawing;//是否正在畫的標記

private Line moveLine;//正在移動的線條

private Line changeLine;//正在改變長度的線條

private ListLine list=new LinkedListLine();

public LineDrawPanel() {

init();

}

public void init() {

MouseAdapter adapter=new MouseAdapter() {

@Override

public void mousePressed(MouseEvent e) {

if(e.getButton()==MouseEvent.BUTTON1){

x1 = e.getX();

y1 = e.getY();

moveLine=getMoveLine(x1, y1);

if(moveLine!=null){

setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));

setToolTipText(“移動”);

return;

}

changeLine=getChangeLine(x1, y1);

if(changeLine!=null){

return;

}

setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));

setToolTipText(“畫圖”);

isDrawing=true;

}

}

@Override

public void mouseMoved(MouseEvent e) {

Line l=getChangeLine(e.getX(), e.getY());

if(l!=null){//設置四種鼠標形狀

setToolTipText(“變長”);

if(Math.abs(l.x1-l.x2)4){

setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR));

}

else if(Math.abs(l.y1-l.y2)4){

setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));

}

else{

double k=(l.y1-l.y2)*1.0/(l.x1-l.x2);

if(k=0) setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR));

else setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR));

}

}else{

l=getMoveLine(e.getX(), e.getY());

if(l!=null) {

setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));

setToolTipText(“移動”);

return;

}

l=getDelLine(e.getX(), e.getY());

if(l!=null){

setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

setToolTipText(“右鍵刪除”);

}else {

setCursor(Cursor.getDefaultCursor());

}

}

}

@Override

public void mouseDragged(MouseEvent e) {

if(moveLine!=null){

moveLine.move(e.getX()-x1, e.getY()-y1);

x1 = e.getX();

y1 = e.getY();

repaint();

return;

}

if(changeLine!=null){

int xVal=e.getX()-x1;

int yVal=e.getY()-y1;

if(Math.abs(xVal)5||Math.abs(yVal)5)

return;

changeLine.changeLength(xVal,yVal );

x1 = e.getX();

y1 = e.getY();

repaint();

return;

}

if(isDrawing){

int xVal=e.getX()-x1;

int yVal=e.getY()-y1;

if(Math.abs(xVal)3||Math.abs(yVal)3)

return;

lastLine=new Line(x1, y1, e.getX(), e.getY());

repaint();

}

}

@Override

public void mouseReleased(MouseEvent e) {

if(e.getButton()==MouseEvent.BUTTON1){

if(moveLine!=null){//移動

moveLine=null;

repaint();

return;

}

if(changeLine!=null){//改變長度

return;

}

if(isDrawing){//畫線條

isDrawing=false;//重置

lastLine=null;

setCursor(Cursor.getDefaultCursor());

int xVal=e.getX()-x1;

int yVal=e.getY()-y1;

if(Math.abs(xVal)3||Math.abs(yVal)3)

return;

Line l=new Line(x1, y1, e.getX(), e.getY());

list.add(l);

}

}else if(e.getButton()==MouseEvent.BUTTON3){//鼠標右鍵

Line delLine=getDelLine(e.getX(), e.getY());//該刪除的線

if(delLine!=null){

list.remove(delLine);

int size=list.size();

lastLine=(size0?list.get(size-1):null);

repaint();

}

}

}

};

addMouseListener(adapter);//添加鼠標動作事件

addMouseMotionListener(adapter);//添加鼠標移動事件

}

public void paint(Graphics g) {

super.paint(g);//調用父類的方法

g.setColor(Color.BLUE);

for (Line l:list) {

l.drawLine(g);

}

g.setColor(Color.red);//畫最後一個線條

if(lastLine!=null){

lastLine.drawLine(g);

}else {

if(list.size()0) list.get(list.size()-1).drawLine(g);

}

}

public Line getChangeLine(int x,int y){//獲取能夠改變的直線

for (Line l:list) {

if(l.isCanChange(x,y))

return l;

}

return null;

}

public Line getDelLine(int x,int y){//獲取能夠刪除的直線

for (Line l:list) {

if(l.isCanDel(x,y))

return l;

}

return null;

}

public Line getMoveLine(int x,int y){//獲取能夠移動的直線

for (Line l:list) {

if(l.isCanMove(x, y))

return l;

}

return null;

}

}

class Line{

public int x1;

public int y1;

public int x2;

public int y2;

public static boolean isStart;//決定改變的線條的那一端

public Line(int x1, int y1, int x2, int y2) {

this.x1 = x1;

this.y1 = y1;

this.x2 = x2;

this.y2 = y2;

}

public void drawLine(Graphics g){

g.drawLine(x1, y1, x2, y2);

}

public void move(int xVal,int yVal){//線條移動

x1+=xVal;

x2+=xVal;

y1+=yVal;

y2+=yVal;

}

public void changeLength(int xVal,int yVal){//改變長度 (該算法有點問題)

if(x1==x2){

xVal=0;

}else {

double k=(y1-y2)*1.0/(x1-x2);

System.out.println(k);

yVal=(int) Math.round(k*xVal);

}

if(isStart){

x1+=xVal;

y1+=yVal;

}else {

x2+=xVal;

y2+=yVal;

}

//x1=(x10?0:x1);

//y1=(y10?0:y1);

}

public boolean isLineValue(){//判斷所畫的線條是否有效

int len2=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);

if(len2==0) return false;

if(Math.sqrt(len2)=1)//長度小於1的,視為無效線條

return false;

return true;

}

public boolean isCanDel(int x,int y){//線條是否可被刪除

int sideA2=(x-x1)*(x-x1)+(y-y1)*(y-y1);

int sideB2=(x-x2)*(x-x2)+(y-y2)*(y-y2);

int sideC2=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);

if(sideA2==0||sideB2==0)return true;

double cosC=(sideA2+sideB2-sideC2)/(2*Math.sqrt(sideA2*sideB2));

if(cosC-0.99) return true;

return false;

}

public boolean isCanChange(int x,int y){//線條是否可改變長度,僅鼠標位於線條兩端時才可改變

if(Math.abs(x1-x)2Math.abs(y1-y)2){

isStart=true;

return true;

}

if(Math.abs(x2-x)2Math.abs(y2-y)2){

isStart=false;

return true;

}

return false;

}

public boolean isCanMove(int x,int y){//線條是否可移動

int midX=(x1+x2)/2;

int midY=(y1+y2)/2;

//if(midX==xmidY==y) return false;

if(Math.abs(midX-x)5Math.abs(midY-y)5)

return true;

return false;

}

}

java中的canvas類有什麼作用?

從詞源可以看出\x0d\x0aCanvas,麻布-畫布-畫油畫的畫板。\x0d\x0aPanel 小塊布-塊版-面板、牆板、地板\x0d\x0aCanvas,直接繼承自Component組件,主要用於繪圖,沒有控件,更原始\x0d\x0aPanel,繼承自Container容器,主要用於鑲嵌在其他控件裡面當面板。\x0d\x0a\x0d\x0a由於Java SE版的Canvas和Panel都繼承自Component,共用Component的paint(Graphics g)\x0d\x0a方式繪製自己的內容。由於使用同一個Graphic類,所以那些drawXXX都一致。\x0d\x0a\x0d\x0a繪製的方式一樣,2者的繪製速度就沒大區別,\x0d\x0aCanvas更適合畫全屏的、沒有控件的情形。像手機上JavaME就主要用Canvas\x0d\x0aPanel適合嵌入到其他控件中使用。

java 塗鴉畫板

 

import java.awt.BasicStroke;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.FlowLayout;

import java.awt.Frame;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Label;

import java.awt.Panel;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.event.MouseMotionListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

public class MouseDrawPanel extends Frame

{

private static final long serialVersionUID = 1L;

MouseEvent e = null;

int startX = -1;

int startY = -1;

int endX = -1;

int endY = -1;

boolean left = false;

public MouseDrawPanel ( String title )

{

setTitle (title);

setLayout (new BorderLayout ());

setResizable (false);

setSize (500, 400);

setLocationRelativeTo (null);

addWindowListener (new WindowAdapter ()

{

@Override

public void windowClosing ( WindowEvent e )

{

System.exit (0);

}

});

}

@Override

public void paintComponents ( Graphics g )

{

float lineWidth = 8.0f;

( (Graphics2D) g ).setStroke (new BasicStroke (lineWidth));

g.setColor (Color.YELLOW);

g.drawLine (startX, startY, endX, endY);

g.dispose ();

}

public static void main ( String[] args )

{

final MouseDrawPanel mdp = new MouseDrawPanel (“Use Mouse Draw”);

Panel panel = new Panel ();

panel.setLayout (new FlowLayout (FlowLayout.LEFT));

Label startL = new Label (“start: “);

Label endL = new Label (“end: “);

final Label nowL = new Label (“now: “);

final Label startR = new Label (“000,000”);

final Label endR = new Label (“000,000”);

final Label nowN = new Label (“000,000”);

panel.add (startL);

panel.add (startR);

panel.add (endL);

panel.add (endR);

panel.add (nowL);

panel.add (nowN);

mdp.add (panel, “South”);

mdp.addMouseMotionListener (new MouseMotionListener ()

{

@Override

public void mouseMoved ( MouseEvent e )

{

if (mdp.left)

{

nowN.setText (e.getX () + ” , ” + e.getY ());

}

}

@Override

public void mouseDragged ( MouseEvent e )

{

if (mdp.left)

{

mdp.endX = e.getX ();

mdp.endY = e.getY ();

mdp.paintComponents (mdp.getGraphics ());

mdp.startX = mdp.endX;

mdp.startY = mdp.endY;

endR.setText (mdp.endX + ” , ” + mdp.endY);

}

}

});

mdp.addMouseListener (new MouseAdapter ()

{

@Override

public void mousePressed ( MouseEvent e )

{

if (e.getButton () == MouseEvent.BUTTON1)

{

mdp.startX = e.getX ();

mdp.startY = e.getY ();

startR.setText (mdp.startX + ” , ” + mdp.startY);

mdp.left = true;

}

else

{

mdp.left = false;

}

}

@Override

public void mouseReleased ( MouseEvent e )

{

if (mdp.left)

{

endR.setText (e.getX () + ” , ” + e.getY ());

}

}

});

mdp.setVisible (true);

}

}

JAVA 第一次繪製畫板的時候畫板會閃爍

可能是你加載canvas的時候閃的

可以新建一個BufferedImage img 和Graphics2D g2d=img.createGraphics;

用g2d繪圖,例如g2d.drawRect(0,0,100,100);

然後直接在jpanel上利用public void paintComponent(Graphics g)函數 g.drawImage(img,0,0,width,height,this)畫出來, 可以解決閃爍問題。canvas屬於比較重的組件 不推薦使用

原創文章,作者:WPJA,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/137439.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WPJA的頭像WPJA
上一篇 2024-10-04 00:17
下一篇 2024-10-04 00:17

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論