Java Repaint - JComponet необходимо перекрасить класс, когда перекраск () вызывается из другого класса

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

Вопрос

Я все еще пытаюсь получить метод перекраски () для работы в отдельном классе с классом, который расширяет JComponent.Я поставил пару сообщения здесь и до сих пор я не смог получить код для работы.Я получил хороший совет.Я помещаю ниже то, что у меня пока.

Главный класс 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);
        }
}
.

класс 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");
    }
}
.

класс 3: (у меня был этот встроен в одни и те же файлы, что и выше, - это будет отдельно, когда у меня есть готовый код)

/**
 * 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 То, что я прочитал и то, что люди опубликовали, это должно работать.Есть ли способ заставить его рисовать сразу.Reppeaint () иногда имеет немного задержки.Я хочу использовать это как начало игры, и я должен быть в состоянии создать арайлист кругов, а затем немедленно перекрасить их. В настоящее время это будет только один круг только в верхнем (0,0) координатах.

Даг девиц hauf

Это было полезно?

Решение

Есть ли способ заставить его рисовать сразу.

Он будет рисовать прямо сейчас, как только GUI виден. Нет ничего особенного, что вам нужно сделать. Нет необходимости в методе setdraw (). Все компоненты будут автоматически окрашены, когда отображается графический интерфейс.

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

Этот код ничего не делает. Ги еще не видны, так что нечего рисовать. Нет причин для вас, вызывающую перекраску, если вы фактически не измените свойство компонента на видимый графический интерфейс.

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

Нет причин создавать метод, который просто делает перекраск (), избавиться от этого метода. Это не то, что я предложил в вашей последней публикации. Я сказал, что вы создаете способ изменить свойство, которое повлияет на результат картины компонента.

Я дал вам пример, например, когда вы используете Setforeground (), метод меняет цвет текста, который будет окрашен, поэтому перекрашивание () автоматически вызывается при изменении цвета.

Избавьтесь от всего сложного кода живописи в вашем компоненте краски, а затем попробуйте сделать простой

graphics.drawString();
.

Не будь играть с вращениями и зажимами (даже у меня проблемы с этими концепциями, и если не сделано правильно, вы не можете получить ничего окрашены), пока не получите что-то базовое. Затем, как только вы получите эту работу, вы делаете что-то более сложное, один шаг за раз, пока вы не поймете основы. Не пишите сложную программу, пока не получите что-то простую работу.

Кроме того, я не знаю, почему вы пытаетесь вытянуть с буферизованного изображения. Просто нарисуйте с помощью графического объекта, который передается в метод PaintComponent (). Нет необходимости использовать буфердизацию, Swing уже с двойным буферизом, поэтому вы просто усложняете свой код.

У вас прочитали Пользовательская картина Учебное пособие еще? Содержит рабочий пример.

Редактировать:

Сказав все вышеперечисленное, у вас все еще есть две фундаментальные проблемы:

  1. Вы не добавляете компонент на панель
  2. Компонент не имеет предпочтительного размера, так что нечего рисовать. Вам необходимо переопределить метод getPrefredsize () для возврата разумного размера для компонента, который вы хотите покрасить.
  3. Даже эти два исправления не решают проблему вашей сложной живописи, но, по крайней мере, теперь я могу получить простую шнурушку (...) на работу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top