本文目錄一覽:
用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