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:
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]
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]