需要帮助理解挥杆代码

Ins*_*der 4 java swing graphics2d paintcomponent translucency

我开发了一个带有椭圆形和按钮的swing应用程序,其输出如下所示,代码如下: -

在此输入图像描述

码:-

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);
}
}
Run Code Online (Sandbox Code Playgroud)

现在我有以下问题:

  1. 如果我已经指定了椭圆的x,y坐标,那么为什么它在调整窗口大小时从其位置移动?(虽然我知道由于FlowLayout它在中心对齐,但它违反了必须修复的属性,因为我指定了坐标x,y).
  2. 其次,如果输出是明显的(我没想到),那么我指定的x,y坐标是哪个角?

Rob*_*bin 6

您指定的坐标位于您自己的"组件"内,而不在"父"容器内.

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

g2.drawRect( 0,0, 199, 199 );
Run Code Online (Sandbox Code Playgroud)

矩形与preferredSize您返回的匹配.您会看到始终绘制此矩形,并在调整窗口大小时移动.椭圆形保持在矩形内的相同相对位置.

请注意,您返回的尺寸getPreferredSize小于您尝试绘制的尺寸.这就解释了为什么你只看到椭圆形的一部分