Ellipse2D ändert Größe

raGe666

Mitglied
Hallo zusammen,

bin zurzeit dabei, mit Graphics rumzuspielen und hab dabei ein Testprogramm zum Zeichnen und Verschieben einer Ellipse2D geschrieben. Es funktioniert auch alles, nur ändert die Ellipse die Größe wenn ich diese verschiebe. Anfangs, bei Position 0, 0, ist die Ellipse rund. Wenn ich sie aber um 10 nach unten verschiebe, verzieht sie sich zusätzlich nach unten, sodass sie oval wird.
Weiß jemand warum das passiert?

Hier zunächst die main-Klasse, die die Gui erstellt:
Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.border.*;

class Test implements Runnable {
    JFrame frame;
    JButton button1, button2, button3, button4;
    JPanel buttonPane, centerPane;
    MyPanel pane;
    MyListener listener;
    JLabel label;

    Border blackline;


    public static void main(String[] args) {
        Test test = new Test();
        SwingUtilities.invokeLater(test);
    }

    public void run() {
        createAndShowGUI();
    }

    public void createAndShowGUI() {
        blackline = BorderFactory.createLineBorder(Color.black);

        frame = new JFrame("GraphicsTest");
        pane  = new MyPanel();
        pane.setBackground(new Color(50, 50, 150));
        pane.setBorder(blackline);
        pane.setMaximumSize(new Dimension(300, 300));
        pane.setPreferredSize(new Dimension(250, 250));
        centerPane = new JPanel();
        centerPane.add(pane);
        buttonPane = new JPanel();
        buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
        listener = new MyListener(this);

        button1 = new JButton("Up");
        button2 = new JButton("Right");
        button3 = new JButton("Down");
        button4 = new JButton("Left");
        label   = new JLabel(pane.x + ", " + pane.y);

        button1.addActionListener(listener);
        button2.addActionListener(listener);
        button3.addActionListener(listener);
        button4.addActionListener(listener);

        buttonPane.add(button1);
        buttonPane.add(button2);
        buttonPane.add(button3);
        buttonPane.add(button4);
        buttonPane.add(label);


        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setLayout(new BorderLayout(5, 5));

        frame.add(centerPane, BorderLayout.CENTER);
        frame.add(buttonPane, BorderLayout.PAGE_END);

        frame.pack();
        frame.setVisible(true);
    }
}

Dann das eigene Panel mit der überschiebenen paintComponent():
[JAVA=72]class MyPanel extends JPanel {
int x;
int y;

public MyPanel() {
super();

x = 0;
y = 0;
}

public void paintComponent(Graphics g) {
System.out.println("paint at " + x + ", " + y);
Graphics2D g2 = (Graphics2D) g;
System.out.println("x before draw: " + x);
System.out.println("y before draw: " + y);
g2.draw(new Ellipse2D.Double(x, y, (x+50), (y+50)));
System.out.println("x after draw: " + x);
System.out.println("y after draw: " + y);
}
}[/code]

Und zuletzt der eigene Listener:
[JAVA=94]class MyListener implements ActionListener {
Test caller;

public MyListener(Test o) {
this.caller = o;
}


public void actionPerformed(ActionEvent evt) {
System.out.println("Before Change");
Object obj = evt.getSource();

if (obj.equals(caller.button1)) {
if (caller.pane.y >= 10) {
caller.pane.y = caller.pane.y - 10;
}
} else if (obj.equals(caller.button2)) {
if (caller.pane.x <= 290) {
caller.pane.x = caller.pane.x + 10;
}
} else if (obj.equals(caller.button3)) {
if (caller.pane.y <= 290) {
caller.pane.y = caller.pane.y + 10;
}
} else if (obj.equals(caller.button4)) {
if (caller.pane.x >= 10) {
caller.pane.x = caller.pane.x - 10;
}
}
System.out.println("Before repaint();");
caller.label.setText(caller.pane.x + ", " + caller.pane.y);
caller.frame.repaint();
System.out.println("After repaint();");
}
}[/code]
 
du musst natürlich in der paintComponent von MyPanel die Größe der Elipse nicht ändern, sonst hast du diese (unerwünschten) Auswirkungen.

Java:
g2.draw(new Ellipse2D.Double(x, y, 50, 50));
die 50,50 geben die Breite, bzw. die Höhe des ungebenen Rechteckes an...wenn du diese vergrößerst, bzw. verkleinerst ändert sich natürlich die Elipse...

[edit] und den Button right nach links zu setzen, den Button left nach rechts... na ja, intuitiv ist was anderes 😀 [/edit]
 
api lesen 😉

public Ellipse2D.Double(double x,
double y,
double w,
double h)

Constructs and initializes an Ellipse2D from the specified coordinates.

Parameters:
x - the X coordinate of the upper-left corner of the framing rectangle
y - the Y coordinate of the upper-left corner of the framing rectangle
w - the width of the framing rectangle
h - the height of the framing rectangle
Since:
1.2
 

Neue Themen


Zurück
Oben