2015-10-30 6 views
-1

Я очень новичок в графической части Java. Я создал фрейм, и на нем я добавил панель, цвет которой был зеленым. Теперь, щелкнув эту панель, я хочу нарисовать круг, используя объект тестового класса Mypanel. Но этого не происходит. Пожалуйста, направляйте!Как использовать метод repaint в Java Swing

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JPanel; 

class Mypanel extends JPanel 
{ 
    @Override 
    public void paintComponent(Graphics g) 
    { 
     g.drawOval(15, 15, 5, 5); 
    }   
} 
public class algo extends javax.swing.JFrame { 

    public algo() { 
     initComponents(); 
     jPanel1.setBackground(Color.GREEN); 
    } 
    Mypanel p = new Mypanel() ; 

    private void jPanel1MouseClicked(java.awt.event.MouseEvent evt) {          
     p.repaint(); 
    }          

    public static void main(String args[]) { 

     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new algo().setVisible(true); 
      } 
     }); 
    } 

} 

Если бы я был догадаться, я бы сказал, что я не должен использовать метод перекрашивать, но мне сказали, что это должно было быть использовано.

+0

По моему мнению, вам понадобится перерисовать, когда вы меняете структуру, т. Е. Овал на квадрат или аналогично. При качании в большинстве случаев изменения компонентов автоматически отражаются. когда вы вызываете метод setter конкретного атрибута. – Acewin

+1

Невозможно быть уверенным, поскольку вы не включили свой метод 'initComponents()' в свой вопрос, но вероятная причина заключается в том, что ваш экземпляр 'Mypanel' имеет ширину нуля и высоту нуля. Вы можете исправить это, переопределив [getPreferredSize()] (http://docs.oracle.com/javase/8/docs/api/java/awt/Component.html#getPreferredSize--) в своем классе Mypanel. Кроме того, первая строка в переопределенном методе paintComponent всегда должна быть 'super.paintComponent (g);'. Если вы этого не сделаете, вы увидите странное поведение. – VGR

+0

Основываясь на вашем коде, я считаю, что вы программист на C#, так? В Java только создание метода с именем вашего объекта и sufix 'MouseClicked' вообще не добавляет событие к вашему объекту. Я настоятельно рекомендую вам больше узнать о Java, событиях, о назначении имен, а затем переписать код =) –

ответ

-2

Есть несколько вещей, чтобы исправить в вашем примере ...

При создании кадра (то есть в конструкторе), вы хотите вызвать супер(). Это первое, что должен сделать конструктор. Затем вы, вероятно, захотите установить начальную ширину/высоту и установить цвет фона зеленого кадра.

Вам нужно добавить слушателя мыши, чтобы на самом деле вызывается метод mouseClicked. Затем добавьте объект «MyPanel» к фрейму и вызовите перерисовку.

Я думаю, это примерно то, что вы собираетесь делать.

+1

* «Я думаю, это примерно то, что вы собираетесь». * Я думаю, вы должны протестировать идеи, прежде чем публиковать их на публике. * «вы, вероятно, захотите установить начальную ширину/высоту» * Нет, компоненты (включая пользовательские компоненты, такие как 'Mypanel', должны переопределять' getPreferredSize', чтобы вернуть разумное значение, тогда кадр должен быть упакован в этот размер. * «Затем добавьте объект« MyPanel »к кадру и вызовите перерисовку». * Лучше добавить панель в кадр при запуске, а затем просто изменить свое состояние (и вызвать 'repaint()', когда кнопка –

+1

Нет причин писать 'super()'. Он всегда вызывается автоматически, если нет вызова другого конструктора. – VGR

1

Этот код, как указано, не будет компилироваться. Для лучшей помощи раньше, отправьте Minimal, Complete, and Verifiable example или Short, Self Contained, Correct Example.

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

class Mypanel extends JPanel { 

    boolean clicked = false; 

    Mypanel() { 
     setBackground(Color.GREEN); 
     MouseListener mouseListener = new MouseAdapter() { 

      @Override 
      public void mouseClicked(MouseEvent e) { 
       clicked = true; 
       repaint(); 
      } 
     }; 
     this.addMouseListener(mouseListener); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 100); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (clicked) { 
      g.drawOval(15, 15, 50, 50); 
     } 
    } 
} 

public class algo extends JFrame { 

    public algo() { 
     initComponents(); 
     pack(); 
     //jPanel1.setBackground(Color.GREEN); ?!? 
    } 

    protected final void initComponents() { 
     add(new Mypanel()); 
    } 

    public static void main(String args[]) { 

     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new algo().setVisible(true); 
      } 
     }); 
    } 
}