java的JFrame的-的DrawLine

时间:2010-11-24 17:50:01

标签: java

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方法中我读取文件行以绘制线条,我得到了相当多的线条,有时甚至超过几百万。结果我的框架冻结了一段时间......这是正确的做法吗?有没有更好的方法呢?这样它就不会冻结,并在显示框架时绘制所有线条?

2 个答案:

答案 0 :(得分:0)

使用Double Buffering进行绘图,可能使用SwingWorker将部分工作移到另一个线程。

答案 1 :(得分:0)

你永远不应该在paintComponent()方法中读取文件。

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

我也不明白需要绘制数百万行。我建议您将这些行一次绘制到BufferedImage,然后您可以使用BufferedImage创建一个可以添加到JLabel的ImageIcon,然后您只需在GUI上显示标签。