2016-03-23 2 views
1

Also ich versuche einen Kreis zu zeichnen, wo ein Benutzer klickt, der dann von der Leiste unten nach unten skaliert werden kann. Alles funktioniert, außer dass der Kreis nicht zeichnet wo ich es möchte. Irgendwelche Vorschläge?Warum wird kein Kreis gezeichnet, wo ich klicke

Hier ist mein Panel-

import java.awt.*; 
    import java.awt.event.MouseEvent; 
    import java.awt.event.MouseListener; 

    import javax.swing.*; 
    import javax.swing.event.*; 

public class TestClass extends JFrame { 
    private JSlider slide; 
    private MainClass myPanel; 
    public int x1=0; 
    public int y1=0; 
    public TestClass(){ 
     super("The Title"); 
     myPanel = new MainClass(); 
     myPanel.setBackground(Color.YELLOW); 
     slide = new JSlider(SwingConstants.HORIZONTAL, 0, 200, 10); 
     slide.setMajorTickSpacing(10); 
     slide.setPaintTicks(true); 

     slide.addChangeListener(
       new ChangeListener(){ 
        public void stateChanged(ChangeEvent e){ 
         myPanel.checkDiameter(slide.getValue()); 
        } 
       } 
      ); 
     HandlerClass handler = new HandlerClass(); 
     slide.addMouseListener(handler); 
     add(slide, BorderLayout.SOUTH); 
     add(myPanel, BorderLayout.CENTER); 


    } 

    public int setX1(){ 
     return x1; 
    } 

    public int setY1(){ 
     return y1; 
    } 

    private class HandlerClass implements MouseListener{ 

     @Override 
     public void mouseClicked(MouseEvent event) { 
      // TODO Auto-generated method stub 
        x1=event.getX(); 

        y1=event.getY(); 
        repaint(); 
     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 


    } 

} 

Hier ist die andere wichtige Klasse, die ein Fenster und rufen Testclass erzeugt;

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

public class MainClass extends JPanel{ 


     private int d = 10; 


     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      TestClass values = new TestClass(); 
      g.setColor(Color.CYAN); 
      g.fillOval(values.setX1()+50, values.setY1(), d, d); 
     } 

     public void checkDiameter(int newD) 
      { 
      //New format for if statements 
      d = (newD >= 0 ? newD //if 
        : 10//else 
        ); 

      repaint(); 
     } 

     public Dimension getPreferredSize(){ 
      return new Dimension(200,200); 
     } 
     public Dimension getMinimumSize(){ 
      return getPreferredSize(); 
     } 
} 
+1

Das ist eine Menge Code. Was hast du probiert, was funktioniert und was nicht? –

+2

Problem: Sie erstellen 'TestClass values ​​= new TestClass();' testclass Objekt in paint method.very bad.Sie erstellen viele Objekte.und da Sie Werte von neu erstellten Objekt erhalten erhalten Sie 0 so 50 + 0 ist immer 0 egal wo Sie geklickt haben –

+1

Stimmen Sie mit @FastSnail überein; Sie ordnen die 'TestClass' bei jedem Klick neu zu! Die Member-Variablen werden daher immer neu initialisiert. –

Antwort

1

Hallo Leute, ich habe einen Weg gefunden, es zum Laufen zu bringen.

import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.*; 
import javax.swing.event.*; 

public class TestClass extends JFrame { 
    private JSlider slide; 
    private MainClass myPanel; 
    public static int x1=0,y1=0; 
    public TestClass(){ 
     super("The Title"); 
     myPanel = new Panel(); 
     myPanel.setBackground(Color.YELLOW); 
     //Allows you to re-size the drawn circle 
     slide = new JSlider(SwingConstants.HORIZONTAL, 0, 200, 10); 
     slide.setMajorTickSpacing(10); 
     slide.setPaintTicks(true); 

     slide.addChangeListener(
       new ChangeListener(){ 
        public void stateChanged(ChangeEvent e){ 
         myPanel.checkDiameter(slide.getValue()); 
        } 
       } 
      ); 
     //Create a way to handle user mouse events 
     HandlerClass handler = new HandlerClass(); 
     myPanel.addMouseListener(handler); 
     add(slide, BorderLayout.SOUTH); 
     add(myPanel, BorderLayout.CENTER); 


    } 



    private class HandlerClass implements MouseListener{ 

     @Override 
     public void mouseClicked(MouseEvent event) { 
      // TODO Auto-generated method stub 

Genau hier ist das, was mit dem Code neu ist, ist diese Methode die x- und y-Koordinaten eines Klicks erhält und sendet sie an Mainclass Objekt MyPanel, die die setPosition Methode hat; Klassenvorstellung vorher.

myPanel.setPosition(event.getX(),event.getY()); 
         repaint(); } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 


    } 

} 

Hier ist die Mainclass Klasse, es poorley genannt wird, da es nicht eigentlich die Hauptklasse ist ... import java.awt. ; importieren Sie javax.swing.; import java.awt.event.MouseEvent; import java.awt.event.MouseListener;

public class Panel extends JPanel{ 
     private int x1,y1; 
      private int d = 10; 

     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 

      g.setColor(Color.CYAN); 
      g.fillOval(x1, y1, d, d); 
     } 

     public void checkDiameter(int newD) 
      { 
      //New format for if statements 
      d = (newD >= 0 ? newD //if 
        : 10//else 
        ); 

      repaint(); 
     } 
     public void setPosition(int newX, int newY) { 
      this.x1 = newX; 
      this.y1 = newY; 
      repaint(); 
     } 

     public Dimension getPreferredSize(){ 
      return new Dimension(200,200); 
     } 
     public Dimension getMinimumSize(){ 
      return getPreferredSize(); 
     } 
}