public void paint(Graphics g)
{
//Typcasting von Graphics zu Graphics2D
Graphics2D g2d = (Graphics2D)g;
//Ermittelt die bestehende Auflösung des Betriebsystems
Dimension windowScreensize = Toolkit.getDefaultToolkit().getScreenSize();
int mitteX = windowScreensize.width / 2;
int mitteY = windowScreensize.height / 2;
//Zeichnen der Spielsteine
g2d.setColor(Color.WHITE);
g2d.fillOval(mitteX+windowScreensize.width / 3, mitteY, windowScreensize.width / 17, windowScreensize.width / 17);
g2d.setColor(Color.BLACK);
g2d.fillOval(mitteX+windowScreensize.width / 3, mitteY+windowScreensize.width / 17, windowScreensize.width / 17, windowScreensize.width / 17);
}
Warum sinnvoller?Mr.Bean hat gesagt.:Ich brauch ja zweimal 9 Kreise, dann wäre doch die zweite Variante sinvoller, oder geht auch die erstere?
private boolean isAlignmentXSet;
private float alignmentX;
private boolean isAlignmentYSet;
private float alignmentY;
protected transient ComponentUI ui;
protected EventListenerList listenerList = new EventListenerList();
private transient ArrayTable clientProperties;
private VetoableChangeSupport vetoableChangeSupport;
private boolean autoscrolls;
private Border border;
private int flags;
private InputVerifier inputVerifier = null;
private boolean verifyInputWhenFocusTarget = true;
transient Component paintingChild;
private JPopupMenu popupMenu;
private InputMap focusInputMap;
private InputMap ancestorInputMap;
private ComponentInputMap windowInputMap;
private ActionMap actionMap;
private boolean aaText;
int ncomponents;
Component component[] = new Component[0];
LayoutManager layoutMgr;
private LightweightDispatcher dispatcher;
private transient FocusTraversalPolicy focusTraversalPolicy;
private boolean focusCycleRoot = false;
private boolean focusTraversalPolicyProvider;
private transient Set printingThreads;
private transient boolean printing = false;
transient ContainerListener containerListener;
transient int listeningChildren;
transient int listeningBoundsChildren;
transient int descendantsCount;
transient ComponentPeer peer;
transient Container parent;
transient AppContext appContext;
int x;
int y;
int width;
int height;
Color foreground;
Color background;
Font font;
Font peerFont;
Cursor cursor;
Locale locale;
transient GraphicsConfiguration graphicsConfig = null;
transient BufferStrategy bufferStrategy = null;
boolean ignoreRepaint = false;
boolean visible = true;
boolean enabled = true;
boolean valid = false;
DropTarget dropTarget;
Vector popups;
private String name;
private boolean nameExplicitlySet = false;
private boolean focusable = true;
private int isFocusTraversableOverridden = FOCUS_TRAVERSABLE_UNKNOWN;
Set[] focusTraversalKeys;
private boolean focusTraversalKeysEnabled = true;
Dimension minSize;
boolean minSizeSet;
Dimension prefSize;
boolean prefSizeSet;
Dimension maxSize;
boolean maxSizeSet;
transient ComponentOrientation componentOrientation= ComponentOrientation.UNKNOWN;
boolean newEventsOnly = false;
transient ComponentListener componentListener;
transient FocusListener focusListener;
transient HierarchyListener hierarchyListener;
transient HierarchyBoundsListener hierarchyBoundsListener;
transient KeyListener keyListener;
transient MouseListener mouseListener;
transient MouseMotionListener mouseMotionListener;
transient MouseWheelListener mouseWheelListener;
transient InputMethodListener inputMethodListener;
transient RuntimeException windowClosingException = null;
long eventMask = AWTEvent.INPUT_METHODS_ENABLED_MASK;
private static final DebugHelper dbg = DebugHelper.create(Component.class);
private PropertyChangeSupport changeSupport;
boolean isPacked = false;
class Kreis{
private int x;
private int y;
private int radius;
public Kreis(int x, int y, int radius){
this.x = x;
this.y = y;
this.radius = radius;
}
public void getX(){
return x;
}
public void setX(int x){
this.x = x;
}
public void getY(){
return y;
}
public void setY(int y){
this.y = y;
}
public void getRadius(){
return radius;
}
public void setRadius(int radius){
this.radius = radius;
}
public void containsPoint(int x, int y){
if(Math.abs(this.x - x) <= radius && Math.abs(this.y - y) <=radius)
return true;
return false;
}
}
class Zeichnen extends JPanel{
private List<Kreis> kreise = new ArrayList<Kreis>();
private Kreis selectedKreis = null;
private int oldX = 0;
private int oldY = 0;
public Zeichnen(){
kreise.add(new Kreis(4, 4, 5));
kreise.add(new Kreis(5, 5, 4));
kreise.add(new Kreis(6, 6, 3));
kreise.add(new Kreis(7, 7, 2));
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
Kreis sel = getKreis(e.getX(), e.getY());
if(sel != null){
selectedKreis = sel;
oldX = sel.getX();
oldY = sel.getY();
setCursor(Cursor.Hand);
}
}
public void mouseReleased(MouseEvent e){
selectedKreis = null;
setCursor(Cursor....);
}
});
addMouseMotionListener(new MouseMotionListener(){
public void mouseMoved(MouseEvent e){
if(selectedKreis != null){
selectedKreis.setX(Math.abs(selectedKreis.getX() - e.getX()));
selectedKreis.setY(Math.abs(selectedKreis.getY() - e.getY()));
repaint();
}
}
});
}
public Kreis getKreis(int x, int y){
for(Kreis k : kreise){
if(k.containsPoint(x, y))
return k;
}
return null;
}
public void paint(Graphics g){
for(Kreis k : kreise){
g.fillOval(k.getX(), k.getY(), k.getRadius(), k.getRadius());
}
}
}
Ich würde es auch nicht machen.Marco13 hat gesagt.:Du solltest die Klasse "Kreis" NICHT von JComponent erben lassen. Ein Kreis hat erstmal genu ZWEI Eigenschaften: Einen Mittelpunkt und einen Radius. Eine JComponent hat erstmal ein paar Eigenschaften mehr...
class SteinZeichnen extends JComponent
{
//Ermittelt die bestehende Auflösung des Betriebsystems
Dimension windowScreensize = Toolkit.getDefaultToolkit().getScreenSize();
int mitteX = windowScreensize.width / 2;
int mitteY = windowScreensize.height / 2;
private Spielsteine stein = new Spielsteine(mitteX+windowScreensize.width / 3,mitteY);
private Spielsteine selectedKreis = null;
private int oldX = 0;
private int oldY = 0;
public SteinZeichnen()
{
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
Spielsteine sel = new Spielsteine(e.getX(), e.getY());
if(sel != null){
selectedKreis = sel;
oldX = sel.getX();
oldY = sel.getY();
//setCursor(Cursor.HAND_CURSOR);
}
}
public void mouseReleased(MouseEvent e)
{
selectedKreis = null;
//setCursor(Cursor....);
}
});
addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseMoved(MouseEvent e)
{
if(selectedKreis != null)
{
selectedKreis.setX(Math.abs(selectedKreis.getX() - e.getX()));
selectedKreis.setY(Math.abs(selectedKreis.getY() - e.getY()));
repaint();
}
}
});
}
/*public Spielsteine getKreis(int x, int y){
for(Kreis k : kreise){
if(k.containsPoint(x, y))
return k;
}
return null;
} */
public void paint(Graphics g)
{
//Typcasting von Graphics zu Graphics2D
Graphics2D g2d = (Graphics2D)g;
g2d.setColor(Color.WHITE);
g2d.fillOval(stein.getX(), stein.getY(), stein.getRadius(), stein.getRadius());
}
}
public class SpielBrett extends JComponent {
public SpielBrett(){}
public void paint(Graphics g){
//Typcasting von Graphics zu Graphics2D
Graphics2D g2d = (Graphics2D)g;
//Ermittelt die bestehende Auflösung des Betriebsystems
Dimension windowScreensize = Toolkit.getDefaultToolkit().getScreenSize();
int mitteX = windowScreensize.width / 2;
int mitteY = windowScreensize.height / 2;
//Farbe der Grafik
g2d.setColor(Color.BLACK);
//Dicke der Linien
Stroke stroke = new BasicStroke( 8 );
g2d.setStroke( stroke );
//drei Rechecke werden gesetzt
g2d.setPaint(Color.white);
g2d.fillRect(mitteX - windowScreensize.width/3, mitteX - windowScreensize.width/3, windowScreensize.width / 2, windowScreensize.width/2);
g2d.setPaint(Color.BLACK);
g2d.drawRect(mitteX - windowScreensize.width/6, mitteX - windowScreensize.width/6, windowScreensize.width / 6, windowScreensize.width / 6);
g2d.drawRect(mitteX - windowScreensize.width/4, mitteX - windowScreensize.width/4, windowScreensize.width / 3, windowScreensize.width / 3);
g2d.drawRect(mitteX - windowScreensize.width/3, mitteX - windowScreensize.width/3, windowScreensize.width / 2, windowScreensize.width/2);
//alle mögichen gekreutzten Setzpunkte
//von oben links aussen nach oben links innen
g2d.drawLine(mitteX - windowScreensize.width/3+1, mitteX - windowScreensize.width/3+1, mitteX - windowScreensize.width/6, mitteX - windowScreensize.width/6);
//von unten links aussen nach unten links innen
g2d.drawLine(mitteX - windowScreensize.width/3+1, (mitteX - windowScreensize.width/3)+ windowScreensize.width / 2-2, mitteX - windowScreensize.width/6, (mitteX - windowScreensize.width/6) + windowScreensize.width/6);
//von oben rechts aussen nach oben rechts innen
g2d.drawLine((mitteX - windowScreensize.width/3)+ windowScreensize.width / 2-2, mitteX - windowScreensize.width/3+1, (mitteX - windowScreensize.width/6)+windowScreensize.width / 6, mitteX - windowScreensize.width/6);
//von unten rechts aussen nach unten rechts innen
g2d.drawLine((mitteX - windowScreensize.width/3)+ windowScreensize.width / 2-2, (mitteX - windowScreensize.width/3)+windowScreensize.width / 2-2, (mitteX - windowScreensize.width/6)+windowScreensize.width / 6, (mitteX - windowScreensize.width/6)+windowScreensize.width / 6);
//von Mitte links aussen nach Mitte links innen
g2d.drawLine(mitteX - windowScreensize.width/3, (mitteX - windowScreensize.width/3)+((windowScreensize.width / 2)/2)-1, mitteX - windowScreensize.width/6, (mitteX - windowScreensize.width/6)+((windowScreensize.width / 6))/2);
//von Mitte rechts aussen nach Mitte rechts innen
g2d.drawLine((mitteX - windowScreensize.width/3)+ windowScreensize.width / 2, (mitteX - windowScreensize.width/3)+((windowScreensize.width / 2)/2)-1, (mitteX - windowScreensize.width/6)+windowScreensize.width / 6, (mitteX - windowScreensize.width/6)+((windowScreensize.width / 6))/2);
//von Mitte oben aussen nach Mitte oben innen
g2d.drawLine((mitteX - windowScreensize.width/3)+((windowScreensize.width / 2)/2)-1, (mitteX - windowScreensize.width/3), (mitteX - windowScreensize.width/6)+((windowScreensize.width / 6))/2, (mitteX - windowScreensize.width/6));
//von Mitte unten aussen nach Mitte unten innen
g2d.drawLine((mitteX - windowScreensize.width/3)+ (windowScreensize.width / 2)/2-1, (mitteX - windowScreensize.width/3)+windowScreensize.width / 2, (mitteX - windowScreensize.width/6)+(windowScreensize.width / 6)/2, (mitteX - windowScreensize.width/6)+windowScreensize.width / 6);
}
}
public class MainWindow extends JFrame{
public MainWindow(){
//erstellt ein Frame
super("Muehle");
//Ermittelt die bestehende Auflösung des Betriebsystems
Dimension windowScreensize = Toolkit.getDefaultToolkit().getScreenSize();
//ob das Aussehen des Fensters verändert werden soll
JFrame.setDefaultLookAndFeelDecorated(false);
//JPanel right = new JPanel(new GridLayout(1,3,0,0));
//this.getContentPane().add(left);
//this.getContentPane().add(right);
this.getContentPane().setBackground(Color.LIGHT_GRAY);
this.getContentPane().setMaximumSize(windowScreensize);
//gibt die Größe des Frames an und macht es sichtbar
this.setBounds(0, 0, windowScreensize.width, windowScreensize.height);
SteinZeichnen stein = new SteinZeichnen();
SpielBrett brett = new SpielBrett();
stein.setBounds(10,10,400,400);
//brett.setBounds(410,410,40,40);
Container pane = getContentPane();
pane.setLayout(null);
pane.add(stein);
//pane.add(brett);
this.setContentPane(pane);
this.setVisible(true);
//Aufruf der Klasse CloseWindow zum Schließen des Fensters und des Prozesses
this.addWindowListener(new CloseWindow());
}
package de.steine;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
public class Main extends JFrame
{
// standartcursor für bewegungen
private Cursor CURSOR_MOVE = new Cursor(Cursor.MOVE_CURSOR);
// defaultcursor
private Cursor CURSOR_DEF = new Cursor(Cursor.DEFAULT_CURSOR);
// liste mit kreisen
private List<Kreis> kreise = new ArrayList<Kreis>();
// aktuell ausgewählter kreis
private Kreis selectedKreis = null;
private MouseListener mouseListener = new MouseListener()
{
public void mouseClicked(MouseEvent e)
{
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mousePressed(MouseEvent e)
{
// kreis finden auf den geklickt wurde
Kreis k = findKreis(e.getX(), e.getY());
if (k != null)
{
selectedKreis = k;
repaint();
getContentPane().setCursor(CURSOR_MOVE);
}
}
public void mouseReleased(MouseEvent e)
{
// kein kreis mehr ausgewählt!
selectedKreis = null;
getContentPane().setCursor(CURSOR_DEF);
repaint();
}
};
private MouseMotionListener motionListener = new MouseMotionListener()
{
public void mouseDragged(MouseEvent e)
{
if (selectedKreis != null)
{
// koordinaten des kreis ändern
selectedKreis.setX(e.getX());
selectedKreis.setY(e.getY());
repaint();
}
}
public void mouseMoved(MouseEvent e)
{
}
};
public Main()
{
super("Spielsteine");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
super.setBounds(20, 20, 400, 400);
// ein paar kreise erzeugen
kreise.add(new Kreis(70, 130, 50));
kreise.add(new Kreis(90, 110, 50));
kreise.add(new Kreis(110, 90, 50));
kreise.add(new Kreis(130, 70, 50));
addMouseListener(mouseListener);
addMouseMotionListener(motionListener);
setVisible(true);
}
public void paint(Graphics g)
{
// weißes quadrat mahlen
g.setColor(Color.WHITE);
g.fillRect(0, 0, 400, 400);
// sämtliche kreise zeichnen
for (Kreis k : kreise)
{
// der momentan ausgewählte kreis erhält zur besseren übersicht einen roten rand
// die anderen kreise bekommen einen schwarzen rahmen
if(k.equals(selectedKreis)){
g.setColor(Color.RED);
} else{
g.setColor(Color.BLACK);
}
g.drawOval(k.getX(), k.getY(), k.getRadius(), k.getRadius());
}
}
/**
* Sucht einen Kreis mit den übergebenen Koordinaten
*
* @param x der x-Wert
* @param y der y-Wert
* @return Kreis welcher den Punkt x/y enthält, sonst null
*/
public Kreis findKreis(int x, int y)
{
for (Kreis k : kreise)
{
if (k.containsPoint(x, y))
{
return k;
}
}
return null;
}
/**
* @param args
*/
public static void main(String[] args)
{
new Main();
}
}
package de.steine;
public class Kreis
{
private int x;
private int y;
private int radius;
public Kreis(int x, int y, int radius){
this.x = x;
this.y = y;
this.radius = radius;
}
public int getRadius()
{
return radius;
}
public void setRadius(int radius)
{
this.radius = radius;
}
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;
}
public boolean containsPoint(int pX, int pY){
return Math.abs(this.x - pX) <= radius && Math.abs(this.y - pY) <= radius;
}
}