1. 程式人生 > >JAVA圖形程式設計Swing之——JPanel繪圖

JAVA圖形程式設計Swing之——JPanel繪圖

/**
 * 定義一個繼承自JPanel的類,重寫它的paint方法 *
 */
class MyPanel1 extends JPanel
{
	private int x = 200;
	private int y = 200;
	private Image image;	//影象緩衝
	private Graphics og;
	
	public void display()
	{
		x ++;
		y ++;
		
		if(og == null)
		{
			//JPanel繼承自Component類,可以使用它的方法createImage建立一幅和JPanel大小相同的圖形緩衝
			//然後用它Image介面的方法獲得繪圖對像
			image = this.createImage(this.getWidth(),this.getHeight());
			if(image != null)og = image.getGraphics();
		}
		
		if(og != null)
		{
			//呼叫的super.paint(g),讓父類做一些事前的工作,如重新整理螢幕
			super.paint(og);	
						
			og.setColor(Color.RED);				//設定畫圖的顏色
			og.fill3DRect(x, y, 100, 100, true);//繪圖				
			//this.paint(this.getGraphics());
		}
		//重繪JPanel
		this.repaint();
	}
	
	/**
	 * repaint方法會呼叫paint方法,並自動獲得Graphics對像
	 * 然後可以用該對像進行2D畫圖
	 * 注:該方法是重寫了JPanel的paint方法
	 */
	public void paint(Graphics g)
	{
		g.drawImage(image, 0, 0, this);	
	}
}

public class PanelTest2
{
	public static void main(String[] args)
	{
		JFrame  jf = new JFrame();
		MyPanel1 jp = new MyPanel1();
		
		jf.setBounds(200, 200, 500, 500);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.add(jp);
		jf.setVisible(true);
		
		while(true)
		{
			//不停的重繪JPanel,實現動畫的效果
			jp.display();
			
			try
			{
				Thread.sleep(300);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
	}
}
    上面的方法是在自定義Panel的內部實現了Image對像的建立,繪圖,重新整理,然後有時候程式的模組化劃分方法並不是這樣,所以還可以在該類的外部建立一個Image對像,並完成繪圖,將該對像的引用傳遞給自定義Panel的繪圖方法,也可以完成繪圖,並且,我覺得這樣更靈活。

相關推薦

JAVA圖形程式設計Swing——JPanel繪圖

/** * 定義一個繼承自JPanel的類,重寫它的paint方法 * */ class MyPanel1 extends JPanel { private int x = 200; private int y = 200; private Image image; //影象緩衝 private

Java圖形程式設計學習(4)Swing元件

1、元件內部的設計—以Swing按鈕為例 背景:MVC模式,即模型-檢視-控制器模式。Swing元件底層大多數都用到了該模式。接下來以按鈕為例分析這種模式。 (1)元件的模型類,一般是實現以Model結尾的介面。按鈕的模型類實現了ButtonModel介面。實現了該介面

Java高階程式設計開發反射機制的應用

瞭解反射機制之前,我們要明確一點,java語言是面向物件程式設計的開發語言。所以,在java的世界中,萬物皆物件。 那麼這樣的話,我們在程式設計開發過程中,所建立的類是不是物件呢?是誰的物件呢?是哪個類的物件呢? 答案是肯定的。類也是物件,它是java.lang.Clas

Java 併發程式設計系列閉鎖(CountDownLatch)

在講閉鎖之前,我們先來思考一個問題:在多執行緒環境下,主執行緒列印一句話,如何保證這句話最後(其他執行緒全部執行完畢)列印? 博主目前可以想到的實現方式有兩種。一種是通過 join() 方法實現,另一

Java 併發程式設計系列帶你瞭解多執行緒

早期的計算機不包含作業系統,它們從頭到尾執行一個程式,這個程式可以訪問計算機中的所有資源。在這種情況下,每次都只能執行一個程式,對於昂貴的計算機資源來說是一種嚴重的浪費。 作業系統出現後,計算機可以執行多個程式,不同的程式在單獨的程序中執行。作業系統負責為各個獨

【轉】Java併發程式設計筆記CopyOnWriteArrayList原始碼分析

併發包中併發List只有CopyOnWriteArrayList這一個,CopyOnWriteArrayList是一個執行緒安全的ArrayList,對其進行修改操作和元素迭代操作都是在底層建立一個拷貝陣列(快照)上進行的,也就是寫時拷貝策略。 我們首先看一下CopyOnW

java併發程式設計實戰理解顯示鎖ReentrantLock

前面兩篇部落格分別介紹了通過synchronized關鍵字(內建鎖機制)和volatile關鍵字實現同步機制。由於volatile實現的同步不能保證操作的原子性,因此一般常用內建鎖實現同步機制,但java5.0版本的內建鎖在功能上有很多缺陷:如無法中斷一個正在等

Java併發程式設計系列十五 Executor框架

                     Java使用執行緒完成非同步任務是很普遍的事,而執行緒的建立與銷燬需要一定的開銷,如果每個任務都需要建立一個執行緒將會消耗大量的計算資源,JDK 5之後把工作單元和執行機制區分開了,工作單元包括Runnable和Callable,而執行機制則由Executor框架提供

Java併發程式設計系列十七 Condition介面

                     通過前面的文章,我們知道任何一個Java物件,都擁有一組監視器方法,主要包括wait()、notify()、notifyAll()方法,這些方法與synchronized關鍵字配合使用可以實現等待/通知機制。而且前面我們已經使用這種方式實現了生產者-消費者模式。類似地

解決java圖形程式設計中關閉圖形的問題

//關閉圖形函式 f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {

Java併發程式設計二十:併發新特性—Lock鎖和條件變數(含程式碼)

簡單使用Lock鎖     Java 5中引入了新的鎖機制——java.util.concurrent.locks中的顯式的互斥鎖:Lock介面,它提供了比synchronized更加廣泛的鎖定操作。Lock介面有3個實現它的類:ReentrantLock、Reetrant

(八 附)java併發程式設計--JVM指令重排分析

  引言:在Java中看似順序的程式碼在JVM中,可能會出現編譯器或者CPU對這些操作指令進行了重新排序;在特定情況下,指令重排將會給我們的程式帶來不確定的結果….. 1.什麼是指令重排?   在計算機執行指令的順序在經過程式編譯器編譯之後形

Java併發程式設計系列十九:原子操作類

原子操作類簡介 當更新一個變數的時候,多出現資料爭用的時候可能出現所意想不到的情況。這時的一般策略是使用synchronized解決,因為synchronized能夠保證多個執行緒不會同時更新該變數。然而,從jdk 5之後,提供了粒度更細、量級更輕,並且在多核

java併發程式設計系列CyclicBarrier的使用

在日常活動中,經常會遇到這樣一種場景:我們會約定在某個地點集合,等所有的組員都集合後,然後我們才開始活動,等活動結束後,所有的組員再一次集合,報道後再各自回家。在我們的程式中,也會經常遇到這種場景,需要所有的子執行緒都結束之後,再匯聚所有的結果,然後根據結果在決定下一步的操

Java併發程式設計二十二:併發新特性—障礙器CyclicBarrier(含程式碼)

CyclicBarrier(又叫障礙器)同樣是Java 5中加入的新特性,使用時需要匯入java.util.concurrent.CylicBarrier。它適用於這樣一種情況:你希望建立一組任

java併發程式設計系列ReadWriteLock讀寫鎖的使用

前面我們講解了Lock的使用,下面我們來講解一下ReadWriteLock鎖的使用,顧明思義,讀寫鎖在讀的時候,上讀鎖,在寫的時候,上寫鎖,這樣就很巧妙的解決synchronized的一個性能問題:讀與讀之間互斥。 ReadWriteLock也是一個介面,原型如下: pub

Java併發程式設計六:Runnable和Thread實現多執行緒的區別(含程式碼)

    Java中實現多執行緒有兩種方法:繼承Thread類、實現Runnable介面,在程式開發中只要是多執行緒,肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比繼承Th

Java併發程式設計系列二十七:ThreadLocal

ThreadLocal簡介 ThreadLocal翻譯過來就是執行緒本地變數,初學者可能以為ThreadLocal是指一個Thread,其實說白了,ThreadLocal就是一個成員變數,只不過這是一個特殊的變數——變數值總是與當前執行緒(呼叫Thread.c

Java併發程式設計系列十四:阻塞佇列

阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。這兩個附加操作支援阻塞地插入和移除方法。支援阻塞插入的方法是指當佇列滿時會阻塞插入元素的執行緒,直到佇列不滿;支援阻塞移除的方法是指當佇列為空時獲取元素的執行緒無法繼續獲取元素直到佇列不空。

Java NIO程式設計例項三Selector

Java NIO主要包含三個概念,即緩衝區(Buffer)、通道(Channel)和選擇器(Selector)。前面的文章已經介紹了緩衝區和通道,本文則講述最複雜的選擇器Selector。 本文是本系列的第三篇文章,關於緩衝區Buffer可以看第一篇: ht