Java 需要帮助理解swing代码吗

Java 需要帮助理解swing代码吗,java,swing,graphics2d,paintcomponent,translucency,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

我开发了一个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);
}
}
现在我有以下问题:

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

  • Q1
    将椭圆放置在坐标50,50处。你的椭圆没有居中

    首先尝试使用
    getWidth()
    getHeight()
    获取帧的中心,然后将其用作椭圆中心的值

    比如:

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

    Q2
    坐标从左上角开始

    指定的坐标位于您自己的“组件”内,而不是“父”容器内

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

    g2.drawRect( 0,0, 199, 199 );
    
    矩形与您返回的
    首选大小
    匹配。您可以看到,始终绘制此矩形,并在调整窗口大小时移动。椭圆形保持在矩形内相同的相对位置


    请注意,您在
    getPreferredSize
    中返回的大小小于您尝试绘制的对象的实际大小。这就解释了为什么你只看到部分椭圆形

    :解释得很好,特别是与矩形的比较。Thanx也可以看到这一点。