/*
* DrawShape.java
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DrawShape extends JFrame {
private JPanel panel;
private JToolBar toolbar;
private JTextField sizeField;
private Circle circle;
private int SW = 14;//stroke width (Strichdicke)
public DrawShape() {
super("DrawShape");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);
circle = new Circle(50, 50, 90);
panel = new JPanel() {
private Stroke stroke = new BasicStroke(SW);
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
((Graphics2D)g).setStroke(stroke);
g.setColor(Color.RED);
circle.draw(g);
}
};
getContentPane().add(panel);
toolbar = new JToolBar();
sizeField = new JTextField(String.valueOf(circle.getDiameter()));
sizeField.selectAll();
toolbar.add(new JLabel("Type size and press Enter: "));
toolbar.add(sizeField);
add(toolbar, BorderLayout.NORTH);
sizeField.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
int d = Integer.parseInt(sizeField.getText());
if(d < SW){
d = SW;
sizeField.setText(String.valueOf(d));
}
/*
Die multi-arg Version von repaint erlaubt uns, das Cliprechteck
der Komponente zu schrumpfen (den Bereich des Bildschirmes,
der durch den Malvorgang beeinflusst wird), damit der Malvorgang
leistungsfähiger werden kann. Wir verwenden diese Technik, um zu
vermeiden, Bildabschnitte neu zu malen, die nicht
geändert haben. Die keine-arg Version dieser Methode malt immer
die gesamt Fläche der Komponente neu.
Wenn wir das Cliprechteck schrumpfen, rufen wir repaint nicht einmal,
sondern zweimal auf. Der erste Aufruf malt den Bereich der Komponente neu,
in dem die Figur vorher war (das ererbte Verhalten ist,
den Bereich mit der gegenwärtigen Hintergrundfarbe zu füllen.).
Der zweite Aufruf malt den Bereich der Komponente neu, in dem die
Figur zur Zeit ist.
Wir können repaint innerhalb des gleichen Eventhandlers mehrfach aufrufen,
aber Swing nimmt diese Informationen und malt die Komponente in
einem einzigen Vorgang neu.
*/
panel.repaint(circle.getX() - SW/2, circle.getY() - SW/2, circle.getDiameter() + SW,
circle.getDiameter() + SW);
circle.setDiameter(d);
panel.repaint(circle.getX() - SW/2, circle.getY() - SW/2, circle.getDiameter() + SW,
circle.getDiameter() + SW);
sizeField.selectAll();
}
});
}
public static void main(final String[] args) {
Runnable gui = new Runnable() {
public void run() {
new DrawShape().setVisible(true);
}
};
//GUI must start on EventDispatchThread:
SwingUtilities.invokeLater(gui);
}
}
class Circle {
private int x;
private int y;
private int diameter;
public Circle(final int x, final int y, final int diameter) {
this.x = x;
this.y = y;
this.diameter = diameter;
}
public void draw(final Graphics g) {
g.drawOval(x, y, diameter, diameter);
}
public int getDiameter() {
return diameter;
}
public void setDiameter(int durchmesser) {
this.diameter = durchmesser;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}