Question

J'essaie toujours d'obtenir une méthode repeinte () pour travailler dans une classe distincte avec une classe qui étend le JComponent.J'ai placé un couple de post ici et jusqu'à présent, je n'ai pas pu obtenir le code du code.J'ai eu de bons conseils.Je place ci-dessous ce que j'ai jusqu'à présent.

classe principale 1:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class DDHGenericFrame extends JFrame {
        private static final long serialVersionUID = 1L;
        DDHGenericPanel d = new DDHGenericPanel(); /*User defined class that is above*/

        public DDHGenericFrame() {
            initUI();
        }

        public final void initUI() {
            add(d);//Adds the panel to the JFrame
            setSize(650,350);
            setTitle("Lines");
            setLocationRelativeTo(null);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }

        public static void main(String[] args) {
            DDHGenericFrame ex = new DDHGenericFrame();
            ex.setVisible(true);
        }
}

classe 2:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;

class DDHGenericPanel extends JPanel {
    private static final long serialVersionUID = 1L;
      public JButton aButton1;
      public JButton aButton2;
      public TestPane tPane = new TestPane();

    DDHGenericPanel(){
        System.out.println("DDH Generic JPanel");

          aButton1 = new JButton();
          aButton1.setText("Button 1");
          aButton1.addActionListener(new myButtonActionListener1());
          add(aButton1);

          aButton2 = new JButton();
          aButton2.setText("Button 2");
          aButton2.addActionListener(new myButtonActionListener2());
          add(aButton2);

          System.out.println("Before the setDraw!!!");
          tPane.setDraw(); 
          System.out.println("After the setDraw!!!");
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        System.out.println("paintComponent of DDHGenericPanel.java");
    }
}   

class myButtonActionListener1 implements ActionListener {
    public TestPane tPane = new TestPane();

    @Override
    public void actionPerformed(ActionEvent arg0) {
         System.out.println("Button 1 -- Before the setDraw!!!");
         tPane.setDraw(); 
         System.out.println("Button 1 -- After the setDraw!!!");
    }
}

class myButtonActionListener2 implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent arg0) {
          System.out.println("Button1 clicked 2");
    }
}

classe 3: (J'avais celui-ci intégré dans les mêmes fichiers que la classe ci-dessus - il sera séparé lorsque j'ai le code fini)

/**
 * This class will draw a cricle with the repaint method
 * @author DDH
 */
class TestPane extends JComponent {
    private static final long serialVersionUID = 1L;
    private static final int LINE_THICKNESS = 4;
      private static final int LINE_GAP = 10;
    private Color lineColor = Color.red;

      /**
      * This method will draw the circle with coordinated (0,0)
      * @param none
      * @return none
      */
      public void setDraw() {
          repaint();//This should call the paintComponent() that is below and paint a circe but it does not for some reason.
      }

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

        int radius = 10;
        BufferedImage buffer = new BufferedImage(radius, radius, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = buffer.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint        (RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);

        Ellipse2D circle = new Ellipse2D.Float(0, 0, radius,radius);
        Shape clip = g2d.getClip();
        g2d.setClip(circle);
        AffineTransform at = g2d.getTransform();

        g2d.setTransform(AffineTransform.getRotateInstance(
                                                    Math.toRadians(45),
                                                    radius / 2, radius / 2));

        int gap = LINE_GAP;

        g2d.setColor(Color.WHITE);
        g2d.fill(circle);

        g2d.setColor(lineColor);
        //g2d.setStroke(new BasicStroke(LINE_THICKNESS));
        for (int index = 0; index < 10; index++) {
            int x1 = index*gap-(LINE_THICKNESS/2);
            int y1 = 0;
            int x2 = index*gap+(LINE_THICKNESS/2);
            int y2 = radius;
            int width = x2 - x1;
            int height = y2 - y1;

            g2d.fillRect(x1, y1, width, height);
            //g2d.drawLine(index * gap, 0, index * gap, getRadius());
        }

        g2d.setTransform(at);
        g2d.setClip(clip);
        g2d.dispose();
        g.drawImage(buffer, 0, 0, this);
    }

}

Début de ce que j'ai lu et ce que les gens ont affiché cela devrait fonctionner.Y a-t-il un moyen de le forcer à peindre tout de suite.Repeindre () a parfois un peu de retard.Je veux utiliser cela comme début d'une partie et je dois pouvoir créer une arrayliste de cercles, puis les repeindre immédiatement. Actuellement, cela ne fera que tirer un cercle dans les coordonnées TOP (0,0).

DOUG DEINES HAUF

Était-ce utile?

La solution

Y a-t-il un moyen de le forcer à peindre tout de suite.

Il va peindre tout de suite dès que l'interface graphique est visible. Il n'y a rien de spécial que vous devez faire. Il n'y a pas besoin d'une méthode SetDraw (). Tous les composants seront automatiquement peints lorsque l'interface graphique est affichée.

      System.out.println("Before the setDraw!!!");
      tPane.setDraw(); 
      System.out.println("After the setDraw!!!");

Ce code ne fait rien. L'interface graphique n'est pas encore visible alors il n'y a rien à peindre. Il n'y a aucune raison pour que vous puissiez repeindre si vous ne modifiez réellement une propriété d'un composant sur une interface graphique visible.

public void setDraw() {
      repaint();
  }

Il n'y a aucune raison de créer une méthode qui fait simplement une repeinte (), se débarrasser de cette méthode. Ce n'est pas ce que j'ai suggéré dans votre dernier postage. J'ai dit que vous avez créé une méthode pour modifier une propriété qui affectera le résultat de la peinture du composant.

Je vous ai donné un exemple, comme lorsque vous utilisez la définition du pays (), la méthode change la couleur du texte à peindre, de sorte que repeindre () est automatiquement appelé lorsque la couleur est modifiée.

Débarrassez-vous de tout le code de peinture complexe de votre composant de peinture, puis essayez de faire un simple

graphics.drawString();

Ne jouez pas avec des rotations et des clips (même si j'ai un problème avec ces concepts et si ce n'est pas fait correctement, vous ne pouvez rien obtenir peint) jusqu'à ce que vous obteniez quelque chose de base qui fonctionne. Ensuite, une fois que vous avez obtenu cela, vous faites quelque chose de plus compliqué, une étape à la fois jusqu'à ce que vous compreniez les bases. N'écrivez pas un programme complexe avant d'avoir quelque chose de simple fonctionnement.

En outre, je ne sais pas pourquoi vous essayez de dessiner d'une image tamponnée. Dessinez simplement à l'aide de l'objet graphique transmis dans la méthode PaintComponent (). Il n'est pas nécessaire d'utiliser un bufferedimage, Swing est déjà double tampon, de sorte que vous compliquez simplement votre code.

Avez-vous lu le Peinture personnalisée Tutorial encore? Il contient un exemple de travail.

EDIT:

Après avoir dit tout ce qui précède, vous avez encore deux problèmes fondamentaux:

  1. Vous n'ajoutez pas le composant au panneau
  2. Le composant n'a pas de taille préférée, il n'y a donc rien à peindre. Vous devez remplacer la méthode GetPreFerredSize () pour renvoyer une taille raisonnable pour le composant que vous souhaitez peindre.
  3. Même ces deux corrections ne résolvent pas le problème de votre peinture complexe, mais au moins maintenant, je peux obtenir un simple cordon (...) pour travailler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top