2010-11-24 12 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()]); 
    } 
} 

こんにちは、描画線のためにファイル行を読み込んだところで、数百万を超えるような行がかなりあります。結果として、私のフレームはしばらくフリーズします...それを行う正しい方法ですか?それを行うためのより良い方法はありますか?フリーズしないように、フレームを表示するときにすべてのラインを描画しますか?java-jframe-drawline

答えて

0

paintComponent()メソッドでファイルを読むべきではありません。

クラスを作成するとき、コンストラクタはファイルを読み込んで、コンポーネントをペイントするときにすべてのデータがメモリに保存されるようにします。

私はまた、何百万本もの線を描く必要性を理解していません。これらの行をBufferedImageに一度描画し、BufferedImageを使用してImageIconを作成し、JLabelに追加してからGUIにラベルを表示することができます。

0

ダブルバッファリングを使用して描画を行い、可能であればSwingWorkerを使用して、一部のワークを別のスレッドに移動します。

+0

私はダブルバッファリングがスイングではデフォルトでオンになっていると思いますか? –