Eine Kugel nach rechts bewegen

mimix

Aktives Mitglied
Hallo

Dieses Programm bewegt eine Kugel nach rechts. Diese Kugel wird mit Mausklicks immer wieder nach rechts verschoben.
Ich möchte aber das die Kugel nach einem Mausklick nach rechts fährt, also nicht das ich 10x mit der Maus klicke damit sich die Kugelposition ändert.

Java:
package tt.test.pacman;

import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JMenuBar;

public class GlassPaneDemo {
   static private MyGlassPane myGlassPane;

   private static void createAndShowGUI() {
      JFrame frame = new JFrame("GlassPaneDemo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      JCheckBox changeButton = new JCheckBox("Glass pane \"sichtbar\"");
      changeButton.setSelected(false);

      Container contentPane = frame.getContentPane();
      contentPane.setLayout(new FlowLayout());
      contentPane.add(changeButton);

      JMenuBar menuBar = new JMenuBar();
      frame.setJMenuBar(menuBar);

      myGlassPane = new MyGlassPane(changeButton, menuBar, frame.getContentPane());
      changeButton.addItemListener(myGlassPane);
      frame.setGlassPane(myGlassPane);

      // Show the window.
      frame.pack();
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      javax.swing.SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }
}

Java:
package tt.test.pacman;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.AbstractButton;
import javax.swing.JComponent;
import javax.swing.JMenuBar;

@SuppressWarnings("serial")
class MyGlassPane extends JComponent implements ItemListener, Runnable {
   Point point;

   int x = 10;

   int y = 10;

   // React to change button clicks.
   public void itemStateChanged(ItemEvent e) {
      setVisible(e.getStateChange() == ItemEvent.SELECTED);
   }

   @Override
   protected void paintComponent(Graphics g) {
      g.setColor(Color.RED);
      g.fillOval((point.x + x++), point.y - 10, 40, 40);

   }

   public void setPoint(Point p) {
      point = p;
   }

   public MyGlassPane(AbstractButton aButton, JMenuBar menuBar, Container contentPane) {
      CBListener listener = new CBListener(aButton, menuBar, this, contentPane);
      addMouseListener(listener);
      addMouseMotionListener(listener);
   }

   @Override
   public void run() {
      Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

      while (true) {
         x++;
         repaint();
         try {
            Thread.sleep(20);
         } catch (InterruptedException ex) {
         }
         Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
      }
   }
}


Java:
package tt.test.pacman;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.AbstractButton;
import javax.swing.JComponent;
import javax.swing.JMenuBar;

@SuppressWarnings("serial")
class MyGlassPane extends JComponent implements ItemListener, Runnable {
   Point point;

   int x = 10;

   int y = 10;

   // React to change button clicks.
   public void itemStateChanged(ItemEvent e) {
      setVisible(e.getStateChange() == ItemEvent.SELECTED);
   }

   @Override
   protected void paintComponent(Graphics g) {
      g.setColor(Color.RED);
      g.fillOval((point.x + x++), point.y - 10, 40, 40);

   }

   public void setPoint(Point p) {
      point = p;
   }

   public MyGlassPane(AbstractButton aButton, JMenuBar menuBar, Container contentPane) {
      CBListener listener = new CBListener(aButton, menuBar, this, contentPane);
      addMouseListener(listener);
      addMouseMotionListener(listener);
   }

   @Override
   public void run() {
      Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

      while (true) {
         x++;
         repaint();
         try {
            Thread.sleep(20);
         } catch (InterruptedException ex) {
         }
         Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
      }
   }
}

Ich hoffe, dass mir jemand helfen kann 🙂
 
Zuletzt bearbeitet:
Tut mir leid 😀

Java:
package tt.test.pacman;

import java.awt.Component;
import java.awt.Container;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;

import javax.swing.JMenuBar;
import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputAdapter;

class CBListener extends MouseInputAdapter {
   Toolkit toolkit;

   Component liveButton;

   JMenuBar menuBar;

   MyGlassPane glassPane;

   Container contentPane;

   public CBListener(Component liveButton, JMenuBar menuBar, MyGlassPane glassPane, Container contentPane) {
      toolkit = Toolkit.getDefaultToolkit();
      this.liveButton = liveButton;
      this.menuBar = menuBar;
      this.glassPane = glassPane;
      this.contentPane = contentPane;
   }

   @Override
   public void mouseMoved(MouseEvent e) {
      redispatchMouseEvent(e, false);
   }

   @Override
   public void mouseDragged(MouseEvent e) {
      redispatchMouseEvent(e, false);
   }

   @Override
   public void mouseClicked(MouseEvent e) {
      redispatchMouseEvent(e, false);
   }

   @Override
   public void mouseEntered(MouseEvent e) {
      redispatchMouseEvent(e, false);
   }

   @Override
   public void mouseExited(MouseEvent e) {
      redispatchMouseEvent(e, false);
   }

   @Override
   public void mousePressed(MouseEvent e) {
      redispatchMouseEvent(e, true);
   }

   @Override
   public void mouseReleased(MouseEvent e) {
      redispatchMouseEvent(e, true);
   }

   // A basic implementation of redispatching events.
   private void redispatchMouseEvent(MouseEvent e, boolean repaint) {
      Point glassPanePoint = e.getPoint();
      Container container = contentPane;
      Point containerPoint = SwingUtilities.convertPoint(glassPane, glassPanePoint, contentPane);
      if (containerPoint.y < 0) {
         if (containerPoint.y + menuBar.getHeight() >= 0) {
         } else {
         }
      } else {
         Component component = SwingUtilities.getDeepestComponentAt(container, containerPoint.x, containerPoint.y);
         if ((component != null) && (component.equals(liveButton))) {
            // Forward events over the check box.
            Point componentPoint = SwingUtilities.convertPoint(glassPane, glassPanePoint, component);
            component.dispatchEvent(new MouseEvent(component, e.getID(), e.getWhen(), e.getModifiers(), componentPoint.x,
                  componentPoint.y, e.getClickCount(), e.isPopupTrigger()));
         }
      }

      if (repaint) {
         glassPane.setPoint(glassPanePoint);
         glassPane.repaint();
      }
   }
}
 
Versuch's mal so:
Java:
public void itemStateChanged(ItemEvent e) {
  setVisible(e.getStateChange() == ItemEvent.SELECTED);
  new Thread(this).start();
}
Gruß,
André
 

Zurück
Oben