2016-05-01 3 views
1

Я пытаюсь работать с утилитой Java paint , и это было немного хлопот.Обновление графики графики/перерисовывание графики

Я пытаюсь сделать что-то, что я предполагаю, является довольно простым. Я рисую квадрат Graphic к JPanel, а затем пытается переместить его с помощью перекрашивать

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

public class testGui { 

    static gui  gc_gui; 
    static int  gv_x; 
    static int  gv_y; 

    public static void main(String[] args) { 

     gc_gui = new gui(); 
     gv_x = 50; 
     gv_y = 50; 

     gc_gui.cv_frame.setVisible(true); 

    } 

    public static class gui { 

     JFrame cv_frame; 
     content cv_content; 

     public gui() { 

     cv_frame = new JFrame(); 
     cv_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     cv_frame.setTitle("Test GUI"); 
     cv_frame.setSize(600, 400); 
     cv_frame.setLayout(new FlowLayout()); 

     cv_content = new content(); 
     cv_content.setBackground(Color.Black); 
     cv_content.setPreferredSize(new Dimension(500, 300)); 
     cv_frame.add(cv_content); 

     gv_x = 0; 
     gv_y = 0; 

     cv_content.update(); 

     } 

    } 

    public static class content extends JPanel { 

     public void paint(Graphics graphic) { 
     super.paint(graphic); 
     draw(graphic); 
     } 

     public void update() { 
     super.repaint(); 
     } 

     public void draw(Graphics graphic) { 
     Graphics2D graphic2D = (Graphics2D) graphic; 
     graphic2D.setPaint(Color.Red); 
     graphic2D.fillRect(gv_x, gv_y, 100, 100); 
     } 

    } 

} 

Я не знаю, почему вызов функции обновления не делает ничего хотя.

Он рисует квадрат в 50х и 50Y, множества его 0x и 0y немедленно, а затем, когда я звоню перекрашивать я ожидал, что он быть перемещен в его новые координаты, хотя она по-прежнему в 50x и 50Y.

Почему это?

+1

Вы не можете сделать это, используя основной протектор. Таким образом, вам нужен новый протектор, способный переместить этот квадрат. – ziLk

+1

Используйте качающийся таймер или прослушиватель событий для перемещения квадрата. –

+0

В стороне, вы захотите изучить и использовать [Соглашения об именах Java] (http://en.wikipedia.org/wiki/Naming_convention_ (программирование) #Java). Имена переменных должны начинаться с нижней буквы, а имена классов - с буквой верхнего регистра. Изучение этого и последующее это позволит нам лучше понять ваш код и позволит вам лучше понять код других. –

ответ

1

Ваше решение - использовать KeyBindings.

https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

, а также. Вам необходимо создать Swing Timer, Thread или Loop, который управляет кадрами, которые должны быть окрашены. и такие

Вот ссылка на Swing, Таймеры, поскольку они довольно легко реализовать: (.. AKA работы с потоками)

https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html

Много программ, которые я вижу также это:

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     createAndShowGUI(); 
    } 
}); 
+0

@trent Это потому, что у вас нет ничего, что основано на времени .... Это означает, что весь ваш код выполняется одновременно ... Не через определенные промежутки времени или периоды. Посмотрите на ссылки, которые я разместил ... Как они подробно объяснят, как реализовать задержку и почему она необходима. – DarkV1

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