2010-11-24 31 views
0
public class FrameDemo extends JPanel 
{ 
    public void paintComponent(Graphics g) 
    { 
      Graphics2D g2 = (Graphics2D)g; 
      String[] read file contents using FileArrayProvider 

      for loop through above String array 
      g2.draw(new Line2D.Double(...)); 
    } 

    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame("JFrame Example"); 
     frame.add(new FrameDemo()); 
     frame.setSize(300, 150); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 

     frame.setVisible(true); 
    } 
} 


class FileArrayProvider // taken from StackOverFlow 
{ 
    public String[] readLines(String filename) throws IOException 
    { 
     FileReader fileReader = new FileReader(filename); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     java.util.List<String> lines = new ArrayList<String>(); 
     String line = null; 
     while((line=bufferedReader.readLine())!=null) 
     { 
      lines.add(line); 
     } 
     bufferedReader.close(); 
     return lines.toArray(new String[lines.size()]); 
    } 
} 

嗨,在paintComponent方法里面,我为了绘制线条而读取文件行,我得到了很多线条,有时候超过几百万。因此,我的框架冻结了一段时间......这是否是正确的做法?有没有更好的方法来做到这一点?这样它就不会冻结,并在显示框架时绘制所有线条?java-jframe-drawline

回答

0

您不应该在paintComponent()方法中读取文件。

当您创建类时,构造函数应该读取该文件,以便在绘制组件时绘制所有数据。

我也不理解需要绘制数百万行。我建议你将这些行画出一次到BufferedImage,然后你可以使用BufferedImage创建一个ImageIcon,它可以添加到JLabel中,然后你只需在GUI上显示标签。

0

使用Double Buffering来执行拖动操作,也可能使用SwingWorker将部分工作移至另一个线程。

+0

我认为默认情况下双缓冲是在Swing中不是吗? – 2010-11-24 18:13:03