2011-09-30 64 views
1

編寫一個使用橢圓大小填充窗口的程序。即使窗口被調整大小,橢圓也會觸摸窗口邊界。如何在框架內調整大小和繪製組件

我有以下代碼:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Ellipse2D; 
import javax.swing.JComponent; 

public class EllipseComponent extends JComponent { 
    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D) g; 

     Ellipse2D.Double ellipse = new Ellipse2D.Double(0,0,150,200); 
     g2.draw(ellipse); 
     g2.setColor(Color.red); 
     g2.fill(ellipse); 
    } 
} 

和主類:

import javax.swing.JFrame; 

public class EllipseViewer { 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame(); 
     frame.setSize(150, 200); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     EllipseComponent component = new EllipseComponent(); 
     frame.add(component); 

     frame.setVisible(true); 
    } 
} 
+0

回答你的問題:「我怎麼可以調整內部的的paintComponent框架「是**不要做**。欲瞭解更多信息,請參閱我的答案。另請注意,JFrame沒有paintComponent方法,但其繪製方法或JComponent的paintComponent方法也是如此。 –

回答

6

在EllipseComponent你做:

Ellipse2D.Double ellipse = new Ellipse2D.Double(0,0,getWidth(),getHeight());

我還建議氣墊船充滿了鰻魚的變化。在這種簡單的情況下,它可能不是一個問題,但隨着paintComponent方法的複雜性增長,您希望儘可能少地使用paintComponent方法計算。

+0

+1用於檢測和修復問題的核心(尺寸橢圓到組件大小vs硬編碼),-1用於解決懷疑的性能瓶頸 – kleopatra

2

不要調整paintComponent中的組件大小。實際上,不要在該方法中創建對象或執行任何程序邏輯。該方法需要儘可能的精簡,儘可能快地繪製,並且就是這樣。您必須明白,您無法完全控制何時甚至是否調用此方法,並且您肯定不希望向其添加代碼,從而可能會降低速度。

你應該在類的構造函數中創建你的橢圓。要根據JComponent中的大小和尺寸的變化調整其大小,使用的ComponentListener:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Ellipse2D; 
import javax.swing.JComponent; 

public class EllipseComponent extends JComponent { 
    Ellipse2D ellipse = null; 

    public EllipseComponent { 
     ellipse = new Ellipse2D.Double(0,0,150,200); 
     addComponentListener(new ComponentAdapter() { 
      public void componentResized(ComponentEvent e) { 
       // set the size of your ellipse here 
       // based on the component's width and height 
      } 
     }); 
    } 

    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2 = (Graphics2D) g; 
     g2.draw(ellipse); 
     g2.setColor(Color.red); 
     g2.fill(ellipse); 
    } 
} 

警告:代碼無法運行,也不測試

+1

形狀很便宜:-)或換句話說:無需增加複雜性。即使你堅持以橢圓作爲領域(儘管Swing的工程師在表現偏執狂的高度,在引入持久的痛苦時表現出了這種效果,但我不會這麼做),但不要調整它的狀態在聽衆中,只需在繪畫方法中進行。 – kleopatra

相關問題