Java Resaint - Jcomponet ha bisogno di ridipingere la classe quando il ridisegno () è chiamato da un'altra classe

StackOverflow https://stackoverflow.com//questions/20025881

Domanda

Sto ancora cercando di ottenere un metodo di ripensamento () per lavorare in una classe separata con una classe che estende il JComponent.Ho messo un paio di post qui e finora non sono stato in grado di far funzionare il codice.Ho ricevuto un buon consiglio.Sto mettendo sotto quello che ho finora.

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: (Ho avuto questo incorporato negli stessi file della classe sopra - sarà separato quando ho il codice finito)

/**
 * 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);
    }

}
.

Frome ciò che ho letto e ciò che le persone hanno pubblicato questo dovrebbe funzionare.C'è un modo per costringerlo a dipingere subito.RITOPINATO () A volte ha un po 'un po' di ritardo.Voglio usare questo come inizio di un gioco e devo essere in grado di creare un'arraylist di cerchi e quindi ridisegnarli immediatamente. Attualmente questo disegnerà solo un cerchio nelle coordinate in alto (0,0).

Doug De Dies Hauf

È stato utile?

Soluzione

.

C'è un modo per costringerlo a dipingere subito.

Dipingerà subito non appena la GUI è visibile. Non c'è niente di speciale che devi fare. Non è necessario un metodo SetDraw (). Tutti i componenti verranno automaticamente verniciati quando viene visualizzata la GUI.

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

Quel codice non fa nulla. La GUI non è ancora visibile quindi non c'è niente da dipingere. Non c'è motivo per voi invocare un ridimensionamento a meno che non modifichi effettivamente una proprietà di un componente su una GUI visibile.

public void setDraw() {
      repaint();
  }
.

Non c'è motivo per creare un metodo che semplicemente si ridisegna (), sbarazzarsi di questo metodo. Non è quello che ho suggerito nel tuo ultimo post. Ho detto di creare un metodo per modificare una proprietà che influenzerà il risultato del dipinto del componente.

Ti ho dato un esempio, come quando si utilizza SetForeground (), il metodo cambia il colore del testo da verniciare, quindi il ridisegno () viene automaticamente invocato quando il colore è cambiato.

Sbarazzati di tutto il complesso codice di pittura nel componente della vernice e poi prova a fare un semplice

graphics.drawString();
.

Non giocare con rotazioni e clip (anche io ho problemi con questi concetti e se non è stato fatto correttamente potresti non ottenere nulla dipinto) finché non si ottiene qualcosa di fondamentale. Poi una volta che hai lavorato, fai qualcosa di più complicato, un passo alla volta finché non capisci le basi. Non scrivere un programma complesso finché non ottieni qualcosa di semplice funzionante.

Inoltre, non so perché stai tentando di disegnare da un'immagine tamponata. Basta disegnare usando l'oggetto grafico che viene trasmesso nel metodo PaintComponent (). Non è necessario utilizzare un bufferiMage, lo swing è già doppio buffer in modo da complicare il tuo codice.

Hai letto il Pittura personalizzata Tutorial? Contiene un esempio di funzionamento.

Modifica:

Avendo detto tutto quanto sopra hai ancora due problemi fondamentali:

    .
  1. Non aggiungi il componente al pannello
  2. Il componente non ha una dimensione preferita, quindi non c'è nulla da dipingere. È necessario scavalcare il metodo GetPreferRedize () per restituire una dimensione ragionevole per il componente che si desidera dipingere.
  3. Anche queste due correzioni non risolvono il problema del tuo complesso dipinto, ma almeno ora posso ottenere un semplice coulisse (...) per lavorare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top