2013-11-17 4 views
1

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

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

Doug Deines Hauf

+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

3

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

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

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

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

public void setDraw() { 
     repaint(); 
    } 

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

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

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

graphics.drawString(); 

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

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

Вы уже читали учебник Custom Painting? Он содержит рабочий пример.

Edit:

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

  1. вы не добавляете компонент к панели
  2. компонент не имеет предпочтительный размер так что рисовать нечем. Вам нужно переопределить метод getPreferredSize(), чтобы вернуть разумный размер для компонента, который вы хотите покрасить.

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

+0

Он работал, когда я устанавливал предпочтительный размер компонента. Он добавил текст после моей кнопки. Мне просто нужно знать положение компонента в любом месте экрана. –

 Смежные вопросы

  • Нет связанных вопросов^_^