Нужна помощь в понимании кода свинга

Я разработал свинг-приложение с овалом и кнопкой, вывод которой показан ниже, и следующий код: -

введите здесь описание изображения

Код:-

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, которые я указал, относились к какому углу?

person Insane Coder    schedule 26.10.2012    source источник
comment
См. также этот пример.   -  person trashgod    schedule 27.10.2012


Ответы (2)


Указанные вами координаты находятся внутри вашего собственного «компонента», а не внутри «родительского» контейнера.

Вероятно, будет легче понять, если вы добавите следующую строку в метод paintComponent:

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

Прямоугольник соответствует возвращаемому вами preferredSize. Вы видите, что этот прямоугольник всегда рисуется и перемещается при изменении размера окна. Овал остается в той же относительной позиции внутри прямоугольника.

Обратите внимание, что размер, который вы возвращаете в getPreferredSize, меньше фактического размера того, что вы пытаетесь нарисовать. Это объясняет, почему вы видите только часть овала

person Robin    schedule 26.10.2012
comment
: Очень хорошо объяснено, особенно сравнение с прямоугольником. Спасибо. - person Insane Coder; 26.10.2012

Q1, поместив свой овал в координаты 50, 50. Вы не центрируете свой овал.

из javadoc

попробуйте сначала получить центр вашего кадра с помощью getWidth() и getHeight(), а затем используйте это как значения для центра вашего овала.

Что-то типа:

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

Q2 координаты начинаются с левого верхнего угла

person phury    schedule 26.10.2012