2014-12-31 4 views
0

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

public void paint(Graphics g){ 
    super.paintComponents(g); 

    Graphics2D g2= (Graphics2D)g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    Ellipse2D.Double circle = new Ellipse2D.Double(); 
    circle.width=50; 
    circle.height=50; 
    circle.x=getX(); 
    circle.y=getY(); 
    g2.draw(circle); 
} 

public static void main(String args[]){ 
    new PaintComponents(); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    if(e.getSource()==bt){ 
     String s=JOptionPane.showInputDialog("enter a number"); 
     if(getX()==0){ 
     setX(100); 
     setY(200); 
     repaint(); 
     } 
     else { 
      setX(200); 
      setY(200); 
      repaint(); 
     } 
    } 
} 

Вот код. Я хочу добавить много кругов. Что мне делать?

В этом вопросе моя цель - сделать дерево BST графически кругами и строкой, но я не знаю, как добавлять круги. Я должен показать узлы в Jframe как круги шаг за шагом, я имею в виду, что каждый раз, когда я добавляю узел с объектом, он должен делать круг в нужном месте. Как я могу это сделать?

+0

Ну, вы только рисуете один круг; вы действительно должны хвататься за какой-то список кругов, который вы можете добавить от слушателя вашей кнопки. Вы также никогда не показываете свою кнопку 'ActionListener' –

+0

1) Слова, напечатанные во всех нижних регистрах, трудно читать, например, пытаться выслушать кого-то, кто бормочет. Пожалуйста, используйте письмо в верхнем регистре в начале предложений, для слова I и собственные имена, такие как 'ArrayList' или Oracle.2) Единственная пустая строка пробела в исходном коде - это все, что требуется *. Пустые строки после '{' или before '}' также типично избыточны. 3) Чтобы лучше помочь, опубликуйте [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверяемый пример) или [SSCCE] (http://www.sscce.org/) (Short, Самостоятельный, правильный пример). –

+0

Я хочу добавить изображение, но я не могу. Что такое репутация? –

ответ

2
  1. Не перегружайте paint, а затем вызвать super.paintComponent, переопределить метод paintComponent вместо, а затем вызвать super.paintComponent
  2. Graphics является общим ресурсом, она используется всеми компонентами были окрашены в данной краски цикла. Будьте осторожны при внесении изменений в него, например, при настройке подсказок рендеринга, поскольку эти изменения будут влиять на все компоненты, окрашенные после этого. Вы должны восстановить контекст Graphics до его предыдущего состояния как можно больше до того, как существует метод рисования, еще лучше создайте копию контекста Graphics, используя Graphics#create, но не забудьте сделать dispose копии до того, как будет создан метод рисования
  3. не переопределить метод paint контейнеров верхнего уровня, вместо этого, начните с создания пользовательского компонента, который простирается от чего-то, как JPanel и следовать шаг 1 ...
  4. не изменяйте х/у позиции из компонент (setX/setY), они делают то, что, по вашему мнению, должны
  5. Создайте List. В список добавьте каждый экземпляр Ellipse2D. Когда вызывается paintComponent, пропустите список и нарисуйте каждый экземпляр Ellipse2D. Вы не сможете контролировать цвет, но вы получите круги для рисования.
+0

5. Создайте свой собственный класс с помощью Ellipse2D и Color. –

+0

@GilbertLeBlanc подумал об этом, но хотел, чтобы все было просто;) – MadProgrammer

0

Вещь paintComponent не работает для контейнеров верхнего уровня, таких как JFrame call super.paint(); , или вместо этого вы можете просто сделать панель и добавить ее в рамку и просто переопределить компонент paint, как вы знаете, остальная часть реализации okkk мне

1

Посмотрите на Custom Painting Approaches, который показывает два общих способа сделать это:

  1. Держите List объектов для рисования, а затем перебирать список в методе paintComponent().
  2. ли настраиваемое картину на BufferedImage, а затем просто отображать BufferedImage в панели

Ссылка содержит рабочие примеры каждого подхода.

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