2010-11-24 56 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