2016-11-23 2 views
0

ich einen Ball in eine JPanel hinzufügen versuchen aber ich bin nicht sicher, wie dies zu tun Im Folgenden wird der Code Ich habe derzeit für den Ball in den JPanel hinzugefügt wird. Ich versuche, mehrere Bälle an einem zufälligen Ort auf dem Bildschirm hinzuzufügen. Der erste erscheint wie erwartet, aber mehr als das erscheint nicht auf dem Bildschirm.Wie man ein Objekt in ein JPanel hinzufügen

Kugelklasse;

public class Ball extends Component { 

public static double ballX = rand.nextInt(500) + 40; 
public static double ballY = rand.nextInt(300) + 10; 
public static Ball[] balls = new Ball[20]; 

public Ball() { 

} 

public void draw(Graphics g2) {    
    Color color = new Color(r, g, b); 
    g2.setColor(color); 
    g2.fillOval((int) ballX, (int) ballY, 30, 30); 
} 
} 

Methode, die versucht, einen Ball in den JPanel hinzuzufügen;

public class BallFrames extends JFrame { 

/* creates static varibles privite for use withing class and public for 
    use out side of the class */ 
public static final JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
public static final JPanel ballPanel = new JPanel(); 
public static JButton button; 
public static JPanel displayPanel = new JPanel(new BorderLayout()); 
private static int FRAME_WIDTH = 600; 
private static int FRAME_HEIGHT = 600; 

/** 
* constructor called method to create the components 
*/ 
public BallFrames() { 
    setSize(FRAME_WIDTH,FRAME_HEIGHT); 
    createComponents(); // creates all compononents 
} 

/* 
* calls helper methods to create all of the componanats needed 
*/ 
private void createComponents() { 
    ActionListener listener = new BallListener(); 
    createPanel(); // creates a panel 
    createButtons(listener); // Creates a button 
    createSlider(); 
} 

/** 
* method to create panels 
*/ 
public void createPanel() { 
    BallComponent component = new BallComponent(); // creates a new BallCompoenet 
    displayPanel.add(component, BorderLayout.CENTER); 
    displayPanel.add(controlPanel, BorderLayout.SOUTH); // adds thecontrol panel 
    add(displayPanel); // adds the dice to the JFrame 
} 

public static void addBall() throws InterruptedException { 
    Ball.balls[BallListener.balls] = new Ball(); 
    System.out.println(BallListener.balls); // testing 
    ballPanel.add(Ball.balls[BallListener.balls]); 
    // ballPanel.add(ball); 
    Runnable r = new BallRunnable(); 
    Thread t = new Thread(r); 
    t.start(); 
    t.join(); 
    ballPanel.repaint(); 
} 

Wie ich sie zeichne;

public class BallComponent extends JComponent { 

/** 
* calls paintComponenet to render images on the screen 
* 
* @param g 
*/ 
@Override 
public void paintComponent(Graphics g) { 
    int delay = 1000; 
    super.paintComponent(g);  // call to super 
    Graphics2D g2 = (Graphics2D) g; // recover the graphic  

    TimerListener listener = new TimerListener(); 
    Timer t = new Timer(delay, listener);  

    if (BallListener.gameOn == true) { 
     for(int i = 0; i < BallListener.balls; i++){   
      Ball.balls[i].draw(g2); 
     } 

    BallFrames.displayPanel.repaint(); 
} 
} 

ActionListener for the buttons; 

public class BallListener implements ActionListener { 

public static boolean gameOn = false; 
public static int balls = 0; 

/** 
* gets the which button has been pressed and responds appriately 
* 
* @param event based on the event it will preform selected actions 
*/ 
@Override 
public void actionPerformed(ActionEvent event) { 
    String action = event.getActionCommand(); 

    switch (action) { 
     case "start": 
      gameOn = true; 

      { 
       try { 
        BallFrames.addBall(); 
       } catch (InterruptedException ex) { 
        Logger.getLogger(BallListener.class.getName()).log(Level.SEVERE, null, ex); 
       } 
       balls++; 
      } 
      BallFrames.displayPanel.repaint(); 
      break; 
     case "pause": 

      break; 
    } 
} 

Kugelgeführt;

public class BallRunnable implements Runnable { 

private static Random rand = new Random(); 
public static boolean goLeft = true; 
public static boolean goRight = false; 
public static boolean goUp = false; 
public static boolean goDown = false; 
public static boolean diagonalUp = false; 
public static boolean diagonalDown = false; 
public static double speed = 0.2f; 

public BallRunnable() { 

} 

public void run() { 
    boundsCheckY1(); 
    boundsCheckX1(); 
    boundsCheckY2(); 
    boundsCheckX2(); 
} 

public void boundsCheckX1() { 
    int temp; 

    if (Ball.ballX < 1) { 
     temp = rand.nextInt(5) + 1; 

     if(temp == 1) { 
      goRight = true; 
      goLeft = false; 
      goUp = false; 
      goDown = false; 
      diagonalUp = false; 
      diagonalDown = false; 
     } else if (temp == 2) { 
      goRight = true; 
      goUp = true; 
      goDown = false; 
      goLeft = false; 
      diagonalUp = false; 
      diagonalDown = false; 
     } else if (temp == 3) { 
      goRight = true; 
      goUp = false; 
      goDown = true; 
      goLeft = false; 
      diagonalUp = false; 
      diagonalDown = false; 
     } else if (temp == 4) { 
      goRight = true; 
      goUp = false; 
      goDown = false; 
      goLeft = false; 
      diagonalUp = true; 
      diagonalDown = false; 
     } else if (temp == 5) { 
      goRight = true; 
      goUp = false; 
      goDown = false; 
      goLeft = false; 
      diagonalUp = false; 
      diagonalDown = true; 
     } 
    } 
} 

public void boundsCheckY1(){ 
    int temp; 

    if (Ball.ballY < 1) { 
     temp = rand.nextInt(5) + 1; 

     if(temp == 1) { 
      goRight = false; 
      goLeft = false; 
      goUp = false; 
      goDown = true; 
      diagonalUp = false; 
      diagonalDown = false; 
     } else if (temp == 2) { 
      goRight = false; 
      goUp = false; 
      goDown = true; 
      goLeft = true; 
      diagonalUp = false; 
      diagonalDown = false; 
     } else if (temp == 3) { 
      goRight = true; 
      goUp = false; 
      goDown = true; 
      goLeft = false; 
      diagonalUp = false; 
      diagonalDown = false; 
     } else if (temp == 4) { 
      goRight = true; 
      goUp = false; 
      goDown = true; 
      goLeft = false; 
      diagonalUp = false; 
      diagonalDown = true; 
     } else if (temp == 5) { 
      goRight = false; 
      goUp = false; 
      goDown = true; 
      goLeft = true; 
      diagonalUp = false; 
      diagonalDown = true; 
     } 
    } 
} 

public void boundsCheckX2() { 
    int temp; 

    if (Ball.ballX > 559) { 
     temp = rand.nextInt(5) + 1; 

     if(temp == 1) { 
      goRight = false; 
      goLeft = true; 
      goUp = false; 
      goDown = false; 
      diagonalUp = false; 
      diagonalDown = false; 
     } else if (temp == 2) { 
      goRight = false; 
      goUp = true; 
      goDown = false; 
      goLeft = true; 
      diagonalUp = false; 
      diagonalDown = false; 
     } else if (temp == 3) { 
      goRight = false; 
      goUp = false; 
      goDown = true; 
      goLeft = true; 
      diagonalUp = false; 
      diagonalDown = false; 
     } else if (temp == 4) { 
      goRight = false; 
      goUp = false; 
      goDown = false; 
      goLeft = true; 
      diagonalUp = true; 
      diagonalDown = false; 
     } else if (temp == 5) { 
      goRight = false; 
      goUp = false; 
      goDown = false; 
      goLeft = true; 
      diagonalUp = false; 
      diagonalDown = true; 
     } 
    } 
} 

public void boundsCheckY2() { 
    int temp; 

    if (Ball.ballY > 470) { 
     temp = rand.nextInt(5) + 1; 

     if(temp == 1) { 
      goRight = false; 
      goLeft = false; 
      goUp = true; 
      goDown = false; 
      diagonalUp = false; 
      diagonalDown = false; 
     } else if (temp == 2) { 
      goRight = false; 
      goUp = true; 
      goDown = false; 
      goLeft = true; 
      diagonalUp = false; 
      diagonalDown = false; 
     } else if (temp == 3) { 
      goRight = true; 
      goUp = true; 
      goDown = false; 
      goLeft = false; 
      diagonalUp = false; 
      diagonalDown = false; 
     } else if (temp == 4) { 
      goRight = true; 
      goUp = true; 
      goDown = false; 
      goLeft = false; 
      diagonalUp = true; 
      diagonalDown = false; 
     } else if (temp == 5) { 
      goRight = false; 
      goUp = true; 
      goDown = false; 
      goLeft = true; 
      diagonalUp = true; 
      diagonalDown = false; 
     } 
    } 
} 

}

Der Zuschauer-Klasse;

public class BallViewer { 

/** 
* creates the main frame 
* 
* @param args 
*/ 
public static void main(String[] args) throws InterruptedException { 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
        if ("Nimbus".equals(info.getName())) { 
         UIManager.setLookAndFeel(info.getClassName()); 
         break; 
        } 
       } 
      } catch (Exception e) { 
       // If Nimbus is not available, you can set the GUI to another look and feel. 
      } 
      // new BallFrames().setVisible(true); 
      JFrame frame = new BallFrames(); // creates new JFrame  
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setTitle("Multi-Treaded Balls");// Sets the Title  
      frame.setVisible(true); // Makes the frame visible 
      frame.setResizable(false); 
     } 
    }); 
} 

}

der Timer Zuhörer; public class TimerListener implements Action {

@Override 
public void actionPerformed(ActionEvent event) { 
    String action = event.getActionCommand(); 

    try { 
     movement(); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(TimerListener.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 
public void movement() throws InterruptedException { 
    if(goLeft == true) {  
     Ball.ballX -= speed;      
    } 
    if(goRight == true) { 
     Ball.ballX += speed;   
    } 
    if(goUp == true) { 
     Ball.ballY -= speed;       
    } 
    if(goDown == true) { 
     Ball.ballY += speed;    
    } 
    if(diagonalUp == true) { 
     Ball.ballY += speed/2;    
    } 
    if(diagonalDown == true) { 
     Ball.ballY -= speed/2;   
    } 

} 

}

ich mehr als einen Ball in der Lage sein wollen, zu einem bestimmten Zeitpunkt auf dem Bildschirm hinzufügen, die ebenfalls um wie der erste Ball bewegt.

+0

es Komponente erstreckt, krank fügen Sie es in den Code. – Ryan

+0

Und was ist der Fehler, den Sie bekommen? – RealSkeptic

+0

Entschuldigung, das war nur ein alter Kommentar in ihrem ist kein Fehler die Bälle scheinen nicht auf dem Bildschirm nach dem ersten hinzugefügt werden. – Ryan

Antwort

1

Ihre Definition der Ball Klasse verhält wie erwartet:

public class Ball extends Component { 

public static double ballX = rand.nextInt(500) + 40; 
public static double ballY = rand.nextInt(300) + 10; 
public static Ball[] balls = new Ball[20]; 

public Ball() { 

} 

public void draw(Graphics g2) {    
    Color color = new Color(r, g, b); 
    g2.setColor(color); 
    g2.fillOval((int) ballX, (int) ballY, 30, 30); 
} 
} 

Alle der static Felder sind zwischen allen Instanzen der Klasse geteilt. Das ist was static bedeutet. Alle Ball s haben die gleichen ballX und ballY Koordinaten.

Was Sie suchen, ist nicht static Felder, die zu jeder einzelnen Instanz gehören. Sie müssen diese Felder jedes Mal initialisieren, wenn Sie einen neuen Ball machen. static Felder werden nur einmal initialisiert, wenn die Klasse geladen wird. Es gibt ein paar weiteren Änderungen, die ich empfehlen würde:

  • Wenn Ihre x- und y-Koordinaten nur den Ball gehören, ist es besser, sie private zu machen.
  • Erweitern Sie JComponent statt Component, da Sie eindeutig Swing hier verwenden.
  • Gerät paintComponent anstelle von draw. Dadurch wird Ihr Zeichnungscode weniger Wartung erfordern, wenn nichts anderes.

Hier ist eine Version der Klasse, die ein wenig besser funktionieren sollte:

public class Ball extends JComponent 
{ 

    private double ballX; 
    private double ballY; 
    public static Ball[] balls = new Ball[20]; 

    public Ball() 
    { 
     ballX = rand.nextInt(500) + 40; 
     ballY = rand.nextInt(300) + 10; 
    } 

    public void paintComponent(Graphics g2) 
    { 
     Color color = new Color(r, g, b); 
     g2.setColor(color); 
     g2.fillOval((int) ballX, (int) ballY, 30, 30); 
    } 
} 
0

Der Malcode ist nur für das Malen.

Sie sollten NIEMALS einen Timer in einer Malmethode erstellen/starten. All diesen Code loswerden.

Sie sollten nie repaint() aufrufen, dies wird eine Endlosschleife verursachen.

Auch loswerden Sie alle Animationscode. Ihre erste Aufgabe ist es, mehrere Kugeln auf dem Panel zu malen. Sobald Sie das funktioniert haben, machen Sie sich Sorgen um eine Animation.

Es ist nicht notwendig, JComponent zu erweitern, da Ihre Klasse KEINE Komponente ist. Das heißt, Sie fügen die Komponente niemals einem Panel hinzu. Alles, was Sie tun, ist das Objekt in einer anderen Klasse zu malen.

Also Ihre BallComponent Klasse (die eine Komponente ist) muss eine ArrayList haben, die die Ballobjekte verfolgt, die Sie malen möchten. Sie benötigen also eine Methode, um dieser ArrayList ein Ball-Objekt hinzuzufügen. Dann durchläuft die Methode paintComponent() einfach die Liste und malt alle Bälle.

Schauen Sie sich die DrawOnComponent Beispiel in Custom Painting Approaches gefunden.

+0

Vielen Dank für die Rückmeldung camickr Ich habe mir Ihr Beispiel angesehen, und stimme mit dem überein, was Sie gesagt haben, ich suche und lerne von dem Beispiel, das Sie gepostet haben. – Ryan

Verwandte Themen