4

楕円形とボタンを備えたスイングアプリケーションを開発しました。その出力は以下に示され、コードは次のとおりです:-

ここに画像の説明を入力

コード:-

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 座標はどのコーナーでしたか?
4

2 に答える 2

6

指定する座標は、「親」コンテナ内ではなく、独自の「コンポーネント」内にあります。

変更すると、おそらく理解しやすくなります。paintComponentメソッドに次の行を追加します。

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

長方形はpreferredSizeあなたが返すものと一致します。この長方形は常に描画され、ウィンドウのサイズを変更すると移動することがわかります。楕円は、長方形内の同じ相対位置にとどまります。

getPreferredSize返されるサイズは、ペイントしようとしているものの実際のサイズよりも小さいことに注意してください。楕円形の一部しか見えないのはそのためです

于 2012-10-26T15:18:50.250 に答える
2

Q1楕円を座標50、50に配置します。楕円を中央に配置しません。

javadocから

最初にフレームの中心を取得してから、それを楕円の中心の値として使用してみgetWidth()getHeight()ください。

何かのようなもの:

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

Q2座標は左上隅から始まります

于 2012-10-26T15:16:31.687 に答える