2013-04-03 44 views
1

我花了最后一个小时仔细阅读互联网上如何创建一个超级简单的显示在我的程序。这里的情况:最简单的方法来显示一个带点的窗口

1.)我有一个循环运行任意次数。每次迭代,它会产生一个“城市”,即随机生成的x坐标和y坐标(两个整数)。

2.)我想创建可能的SIMPLEST显示。没有什么花哨。也就是说,理想情况下,一个尺寸为600x600的窗口为每个迭代的for循环绘制一个黑点。

这是我到目前为止有:

f.setPreferredSize(new Dimension(600, 600)); 
    f.pack(); 
    f.setVisible(true); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    for (int i = 0; i <= nodeArray.length-1; i++) 
    { 
     nodeArray[i] = new Node(); 
     nodeArray[i].x = 0 + (600 - 0) * r.nextDouble(); 
     nodeArray[i].y = 0 + (600 - 0) * r.nextDouble(); 

     //DRAW DOT HERE? 
    } 

对于这个for循环,我想提请每个迭代,在这个窗口中,黑点与x坐标(INT)nodeArray [I] .x和y坐标(int)nodeArray [i] .y

我真的很感谢任何帮助。这是一个有点高级的算法课程,我有点尴尬,我似乎无法弄清楚图形在Java中如何工作...

回答

2

答案取决于你想达到什么,但基本上,你需要一些方法将结果绘制到屏幕上。

如果数据不经常更改,最好使用后备缓冲区,因为它对渲染器更快,而不必每次循环访问数据集。

退房Performing Custom Painting

动画

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Dotty { 

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

    public Dotty() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private int count = 0; 
     private int dotCount = 1000; 
     private BufferedImage background; 

     public TestPane() { 
      background = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB); 

      Timer timer; 
      timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        count++; 
        if (count < dotCount) { 
         int x = (int) Math.round((Math.random() * 600)); 
         int y = (int) Math.round((Math.random() * 600)); 
         Graphics2D g2d = background.createGraphics(); 
         g2d.setColor(Color.BLACK); 
         g2d.drawRect(x, y, 1, 1); 
         g2d.dispose(); 
         repaint(); 
        } else { 
         ((Timer) e.getSource()).stop(); 
        } 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(600, 600); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      int x = (getWidth() - background.getWidth())/2; 
      int y = (getHeight() - background.getHeight())/2; 
      g2d.drawImage(background, x, y, this); 
      g2d.dispose(); 
     } 
    } 
} 

直渲染

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Dotty { 

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

    public Dotty() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private int count = 0; 
     private int dotCount = 1000; 
     private BufferedImage background; 

     public TestPane() { 
      background = new BufferedImage(600, 600, BufferedImage.TYPE_INT_ARGB); 

      for (int count = 0; count < dotCount; count++) { 
       int x = (int) Math.round((Math.random() * 600)); 
       int y = (int) Math.round((Math.random() * 600)); 
       Graphics2D g2d = background.createGraphics(); 
       g2d.setColor(Color.BLACK); 
       g2d.drawRect(x, y, 1, 1); 
       g2d.dispose(); 
       repaint(); 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(600, 600); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      int x = (getWidth() - background.getWidth())/2; 
      int y = (getHeight() - background.getHeight())/2; 
      g2d.drawImage(background, x, y, this); 
      g2d.dispose(); 
     } 
    } 
} 
相关问题