2015-09-03 4 views
1

Чтобы создать свою первую 2D-игру на Java, я подумал об использовании , обновив его с новым представлением каждые 50 мс.Компонент Paint после создания

JFrame frame = new JFrame(); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
// ... 
frame.setVisible(true); 
// ... 
Container area = frame.getContentPane(); 
Graphics pen = area.getGraphics(); 
pen.clearRect(0, 0, area.getWidth(), area.getHeight()); // Remove previous drawing 
pen.drawString("Text", 50, 50); 
// ... 
area.repaint(); 

Но это не сработает; окно не изменяется.

+4

Не используйте 'getGraphics()' для компонентов swing. Вместо этого вы должны переопределить 'paintComponent()' - см. Учебник о [пользовательской картине в swing] (https://docs.oracle.com/javase/tutorial/uiswing/painting/). – kiheru

ответ

1

Как kiheru уже сказано, используйте paintComponent(Graphics g) для изготовленный под заказ покраска. Вот пример:

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 
import java.util.Random; 

public class Example { 

    int i = 0; 

    public Example() { 

     JFrame frame = new JFrame(); 

     frame.getContentPane().add(new DrawingPanel()); 

     frame.setSize(500, 500); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     ActionListener actionListener = new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       frame.getContentPane().repaint(); 

      } 

     }; 

     Timer timer = new Timer(500, actionListener); //500 = Every 500 milliseconds 
     timer.start(); 

    } 

    class DrawingPanel extends JPanel { 

     @Override 
     public void paintComponent(Graphics g) { 

      super.paintComponent(g); // Removes previous graphics 

      Random r = new Random(); //Randomizer 

      //Random x- and y-coordinates 
      int x = r.nextInt(400); 
      int y = r.nextInt(400); 

      //Random rgb-values 
      int red = r.nextInt(255); 
      int green = r.nextInt(255); 
      int blue = r.nextInt(255); 

      //Random width and height 
      int width = r.nextInt(100); 
      int height = r.nextInt(100); 

      g.setColor(new Color(red, green, blue)); //Setting color of the graphics 

      g.fillRect(x, y, width, height); //Filling a rectangle 

     } 

    } 

    public static void main(String[] args) { 

     new Example(); 

    } 

} 
0

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

private static BufferedImage bufferedImage = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB); 
    private static Graphics2D gBuff = bufferedImage.createGraphics(); 

    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame() 
     { 
      @Override 
      public void paint(Graphics g) 
      { 
       g.drawImage(bufferedImage,0,0,this); 
      } 
     }; 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 400); 

     gBuff.setColor(Color.WHITE); 
     gBuff.fillRect(0, 0, frame.getWidth(), frame.getHeight()); // Remove previous drawing 
     gBuff.setColor(Color.BLACK); 
     gBuff.drawString("Text", 50, 50); 


     // ... 
     frame.setVisible(true); 
     // ... 
    } 
Смежные вопросы