0
votes

Comment afficher un graphique d'une autre classe

J'essaie d'afficher un graphique d'une classe distincte sur un JPanel de ma classe principale.

La classe principale est myTest et la classe distincte est la balle. La balle a une méthode de composant de peinture et dessine simplement un cercle de couleur. Dans MyTest, j'instaine une balle et l'ajoutez à un JPanel (DP): DP.Ajouter (balle). Très simple, mais tout ce que je reçois est le fond du panneau blanc et aucune balle n'est dessinée. P>

Voici le code MyTest: H2>
package myStuff;

import java.awt.*;
import javax.swing.*;

public class Ball extends JComponent{

    private int Width; 
    private int Height; 
    public Ball (int width, int height ) {
        Width=width;
        Height=height;      
    }

    @Override
    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        super.paintComponent(g2d);
        g2d.setColor(Color.RED);
        g2d.fillOval(Width/2,Height/2,40,40);
        System.out.println("Doing graphics....");
    }
}


2 commentaires

Je viens de remarquer que j'ai ajouté le JPanel DP deux fois. Je l'ai sorti hors partir () mais cela n'a fait aucune différence ... toujours pas de balle.


Il est probable que le ball ne doit pas être un jcommonent mais savoir simplement vous peindre à la demande de le faire. Le composant dans lequel il est peint pourrait être un tenniscourt ou golfcourse qui peut contenir des références à une ou plusieurs instances de ball , Paddle , net etc.


3 Réponses :


0
votes

Vous définissez la taille du cadre, mais le panneau a une taille de zéro. Vous devez définir la taille préférée du panneau, pas la taille du cadre. Ensuite, obtenez la taille préférée du panneau pour passer au constructeur de la boule et emballez le cadre avant de le rendre visible.


1 commentaires

D'accord, j'ai fait tout cela et ajouté des déclarations d'impression pour vérifier que les dimensions ont été passées et elles étaient. J'ai toujours un fond blanc et pas de balle.



0
votes

Définissez la taille du panneau avant la ligne,

setPreferredSize(new Dimension(Width, Height));


4 commentaires

J'ai fait tout ça. Toujours ne pas avoir une balle.


dp.setbackground (couleur.white); Dimension d = nouvelle dimension (800.400); dp.setpreferredSize (D); Balle ball = nouvelle balle (dp.gepreferredSize ()); dp.add (balle); cadre.add (DP); cadre.pack (); cadre.setvisible (vrai);


balle publique (dimension d) {largeur = (int) d.getheight (); Hauteur = (int) d.getwidth (); System.out.println (hauteur + "" + largeur); }


Faites les modifications suivantes dans votre code d'origine. Définissez la taille du panneau à l'aide de la méthode dp.setsize (). Ensuite, ajoutez simplement cette ligne SetPreFerredSize (nouvelle dimension (largeur, hauteur)); Exactement comme il est à la fin de votre constructeur de votre code d'origine.



1
votes

Voici un exemple de travail.

import java.awt.*;
import javax.swing.*;

public class Mytest {
   private JFrame frame = new JFrame();

   public static void main(String[] args) {
      Mytest gui = new Mytest();
      SwingUtilities.invokeLater(() -> gui.go());
   }

   public void go() {
      frame.setTitle("Test");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JPanel dp = new JPanel();
      dp.setPreferredSize(new Dimension(500, 500));
      dp.setBackground(Color.WHITE);
      Ball ball = new Ball(150, 150);
      dp.add(ball);
      frame.add(dp);
      frame.pack(); // invokes layout and sizes components
      frame.setLocationRelativeTo(null); // centers on screen
      frame.setVisible(true);
   }

}

class Ball extends JComponent {

   private int width;
   private int height;

   // A ball should probably only have a "diameter"
   public Ball(int width, int height) {
      this.width = width;
      this.height = height;
      setPreferredSize(new Dimension(width, height));
   }

   @Override
   public void paintComponent(Graphics g) {
      Graphics2D g2d = (Graphics2D) g;
      super.paintComponent(g2d);
      g2d.setColor(Color.RED);
      // smooths out the graphics
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
      g2d.fillOval(0, 0, width, height);
      System.out.println("Doing graphics....");
   }
}


6 commentaires

Wow ... ça a fonctionné. Je venais d'avoir manqué d'ajouter la taille préférée à la classe de balle. Une fois que j'ai fait ça, j'ai eu une belle balle rouge! Merci beaucoup de m'aider. J'ai appris beaucoup de choses. Vous étiez super! Merci encore.


Pourquoi la balle a-t-elle des champs "largeur" ​​et "hauteur"? Ils cachent les champs qui existent déjà dans la superclasse des composants.


C'était parce que, de retour quand j'ai commencé tout cela, je pensais que je devais envoyer la taille du panneau. Je suppose que je n'ai pas vraiment besoin d'eux maintenant! Merci d'avoir fait remarquer cela ;)


Je ne m'en avaisais pas. Ce n'est pas facile de connaître tous les champs de super classe hérités. Et même Jcomponent redéfinit la hauteur dans un contexte local qui serait également signalé comme caché un champ de super classe.


Merci jim829. Si vous regardez le code révisé, la largeur et la hauteur passées dans le constructeur étaient en réalité la largeur et la hauteur de la balle. J'ai changé le code de classe de balle pour laisser la balle choisir au hasard sa taille. Donc je suis de retour à une balle de constructeur vide (). Merci encore. Tout fonctionne!


S'il vous plaît Acceptez la réponse si cela a aidé à résoudre le problème.