2014-09-07 4 views
0

Я пытаюсь научиться делать пользовательские материалы GUI в Java для группового проекта, над которым я работаю. В прошлом я делал GUI типа пользовательской формы, поэтому я знаю суть того, что я здесь делаю, но пользовательский материал рисования все еще меня смущает.Пользовательский цикл рисования в Swing

Я скопировал этот код из Интернета, и я пытался выяснить, как он работает, но я не понимаю, почему я не могу закодировать метод рисования. В качестве простого теста я пытаюсь сделать программу нарисовать овал на моем курсоре. Он рисует овал на курсоре, но только один раз во время выполнения, а затем ничего не делает.

Как это сделать, чтобы я мог продолжать рисовать вещи? Или есть другой способ, который мне нужно вызвать/использовать методы?

public class BombermanGUI extends JFrame { 
    public static final int CANVAS_WIDTH = 640; 
    public static final int CANVAS_HEIGHT = 480; 

    private DrawCanvas canvas; 

    public BombermanGUI() { 
     canvas = new DrawCanvas(); 
     canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT)); 

     Container cp = getContentPane(); 
     cp.add(canvas); 

     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.pack();    
     this.setTitle("......"); 
     this.setVisible(true);  
    } 

    private class DrawCanvas extends JPanel{ 
     @Override 
     public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     setBackground(Color.BLACK); 

     int x, y; 
     x = MouseInfo.getPointerInfo().getLocation().x - this.getLocationOnScreen().x; 
     y = MouseInfo.getPointerInfo().getLocation().y - this.getLocationOnScreen().y; 
     g.setColor(Color.YELLOW);  
     g.drawOval(x, y, 10, 10); 

     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new BombermanGUI(); 
     } 
     }); 
    } 
} 
+1

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

+0

К сожалению, я немного прикрутил код при удалении ненужных битов, исправьте его сейчас – Nathan

+0

Также посмотрите на [TimerBasedAnimation] (http://www.java2s.com/Tutorial/Java/0240__Swing/Timerbasedanimation.htm) для идей. – DavidPostill

ответ

2

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

Посмотрите на Painting in AWT and Swing и Performing Custom Painting Больше подробностей.

Картина - разрушительный процесс. Предполагается, что когда появляется перерисовка, вы перекрасите все состояние текущего компонента. Это означает, что вам нужно какое-то модель, которая поддерживает все содержимое, которое должно быть окрашено ...

взглянуть на 2D Graphics, в частности, взглянуть на раздел на Shape

MouseInfo является серьезный дрянной способ определить местоположение мыши для этой цели, вместо этого вы должны использовать MouseListener and/or MouseMotionListener для обнаружения событий мыши.

В принципе, когда пользователь нажимает кнопку мыши, вы записываете местоположение нажатия мыши. Когда мышь перемещается, вы вычисляете ширину и высоту движения относительно нажатия мыши и обновляете «текущую» форму. Вы должны позвонить repaint, чтобы попросить обновить интерфейс и нарисовать эту форму с помощью метода paintComponent (сначала покрасьте все предыдущие фигуры).

Когда кнопка мыши отпущена, вы должны передать «текущую» форму модели, поэтому она будет нарисована каждый раз, когда вызывается paintComponent.

+0

Ничего себе, это чертовски много, чтобы обернуть мою голову.К счастью, у меня есть время, чтобы все это понять, спасибо – Nathan

+0

@ user2856410 Понятно, что это действительно просто (без обид, я знаю, что это кажется очень сложным), проблема в том, что это нелинейная проблема, поскольку вы работаете в управляемом событиями окружающей среды, поэтому вам необходимо поддерживать «состояние состояния» от одного события к другому, которое не всегда связано напрямую – MadProgrammer

0

ЭТО tobais_k ОТВЕТ IM ПРИЕМ закрыть вопрос!

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

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