2012-10-26 139 views
4

我開發一個Swing應用程序有一個橢圓形的按鈕,其輸出如下所示,代碼幫助如下: -需要理解Swing代碼

enter image description here

代碼: -

import java.awt.AlphaComposite; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 


public class AlphaCompositeDemo extends JFrame{ 
AlphaCompositeDemo() 
{ 
super("AlphaComposite Demo"); 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
setSize(400,400); 
setLayout(new FlowLayout()); 

setBackground(new Color(0.2f,0.7f,0.1f,0.4f)); 
comp c=new comp(); 

add(c); 
add(new JButton("Click")); 
setVisible(true); 
} 
public static void main(String args[]) 
{ 
JFrame.setDefaultLookAndFeelDecorated(true); 
SwingUtilities.invokeLater(new Runnable(){public void run(){new AlphaCompositeDemo();}}); 
} 
} 

class comp extends JComponent 
{ 
public void paintComponent(Graphics g) 
{ 
    Graphics2D g2=(Graphics2D)g.create(); 
    g2.setComposite(AlphaComposite.SrcOver); 
    g2.setColor(Color.RED); 
    g2.fillOval(50, 50, 220, 120); 
} 
public Dimension getPreferredSize() 
{ 
    return new Dimension(200,200); 
} 
} 

現在我有以下問題:

  1. 如果我指定的x,y座標爲橢圓形,那麼爲什麼當窗口調整大小時它會從它的位置移開? (雖然我知道由於FlowLayout它在中心對齊,但它違反了必須固定的屬性,因爲我已指定座標x,y)。
  2. 第二,如果輸出是顯而易見的(我並不期待),那麼我指定的x,y座標是w.r.t哪個角?
+0

另請參閱本[示例](https://sites.google.com/site/drjohnbmatthews/composite)。 – trashgod

回答

6

座標指定是你自己的「組件」中,而不是裏面的「父」容器配合啓動。

可能更容易,如果你更改以下行添加到paintComponent方法來理解:

g2.drawRect(0,0, 199, 199); 

矩形匹配您返回preferredSize。你會發現這個矩形總是被繪製,並在調整窗口大小時移動。橢圓在矩形內保持相同的相對位置。

請注意,您在getPreferredSize中返回的尺寸小於您嘗試繪製的實際尺寸。這就解釋了爲什麼你只看到橢圓形的一部分

+1

:非常好的解釋,特別是與rectangle.Thanx的比較 –

2

Q1把你的橢圓形放在座標50,50處。你不要居中你的橢圓形。

javadoc

嘗試getWidth()getHeight()讓你的框架的中心,然後再使用它作爲值的橢圓形的中心。

喜歡的東西:

g2d.fillOval(frame.getHeight()/2, frame.getWidth()/2, 200, 200); 

Q2從左上角