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方法中我读取文件行以绘制线条,我得到了相当多的线条,有时甚至超过几百万。结果我的框架冻结了一段时间......这是正确的做法吗?有没有更好的方法呢?这样它就不会冻结,并在显示框架时绘制所有线条?
答案 0 :(得分:0)
使用Double Buffering进行绘图,可能使用SwingWorker将部分工作移到另一个线程。
答案 1 :(得分:0)
你永远不应该在paintComponent()方法中读取文件。
当你创建类时,构造函数应该读取文件,以便在绘制组件时所有数据都在内存中。
我也不明白需要绘制数百万行。我建议您将这些行一次绘制到BufferedImage,然后您可以使用BufferedImage创建一个可以添加到JLabel的ImageIcon,然后您只需在GUI上显示标签。