Как запустить метод рисования, чтобы анимировать JPanel? - PullRequest
3 голосов
/ 04 марта 2012

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

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


public class paintTest extends JPanel{
private static JFrame theWindow = new JFrame("Window");
static boolean blueSqr = false;

public void paint(Graphics g) {
    g.setColor(Color.RED);
    g.fillRect(10, 10, 10, 10);

    if(blueSqr){
        g.setColor(Color.BLUE);
        g.fillRect(10, 10, 10, 10);
    }
}

public static void main(String[] args){
    createWindow();
    theWindow.getContentPane().add(new paintTest());
    while(true){
        blueSqr = false;

        System.out.println("off");

        try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}

        blueSqr = true;
        // Needs something here
        System.out.println("on");

        try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
        }
}

public static void createWindow(){
    theWindow.setSize(500, 500);
    theWindow.setLocationRelativeTo(null);
    theWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    theWindow.setVisible(true);
}
}

Любая помощь будет очень хорошей.

Ответы [ 2 ]

5 голосов
/ 04 марта 2012

Используйте Swing Timer для вызова repaint(). Также переопределите paintComponent() в JPanel вместо paint().

Примерно так:

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

public class PaintTest extends JPanel{

    boolean blueSqr = false;

    PaintTest() {
        setPreferredSize(new Dimension(100,25));
        ActionListener al = new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                blueSqr = !blueSqr;
                repaint();
            }
        };
        Timer timer = new Timer(1000,al);
        timer.start();
    }

    public void paintComponent(Graphics g) {
        Color c = (blueSqr ? Color.BLUE : Color.RED);
        g.setColor(c);
        g.fillRect(10, 10, 10, 10);
    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame theWindow = new JFrame("Window");
                theWindow.getContentPane().add(new PaintTest());
                createWindow(theWindow);
            }
        });
    }

    public static void createWindow(JFrame theWindow){
        theWindow.pack();
        theWindow.setLocationByPlatform(true);
        theWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        theWindow.setVisible(true);
    }
}

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

4 голосов
/ 04 марта 2012

ваши проблемы

1), вызвав Thread.sleep(int) в связанном с Swing коде, никогда не делайте этого из-за задержки в Swing (есть много тем, почему бы не использовать sleep в языках программирования ...) используйте Таймер Swing

2) ваш JPanel не возвращает XxxSize

3) для использования Swing paintComponent(), только если вы получилидействительно важные причины, тогда используйте метод paint() больше о перерисовке и анимации графики в учебнике 2D Графика

4) Графический интерфейс Swing должен быть встроен в Thread Dispatch Thread

...