将数据插入数据库正在冻结我的应用程序

时间:2013-12-01 20:19:51

标签: java database timer freeze swingworker

我上课了。这个类正在为我的Array点添加新项。这些点正在移动,并从计时器的主体重新绘制一个面板以在新的位置绘制它们。我连接到数据库sqlite。当我调用一个插入函数来添加点到表 - 应用程序冻结1秒。

我想问一下有没有办法不停止绘画/重新绘画?我希望插入操作将在后台进行。

任何想法?

Ps:我听说过摇摆工作者但是idk适合我的情况

编辑:

class Generator{
    ChangeListener listener;
    ArrayList<String> s;
    JPanel p;
    Timer generatorTimer;
    MyDatabase b;


    public Generator(){
    this.s = new ArrayList<String>();
    this.b = new MyDatabase();
      generatorTimer = new Timer(40, new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
              addItem();     
              p.repaint();
      }
    });
    generatorTimer.start();
    }
    private void addItem(){
        String newString = new String("sampleText");
        s.add(newString);
        b.insert(newString);  //inserting new item do database
        listener.stateChanged(new ChangeEvent(this));
    }
    public void setPanel(JPanel p){
        this.p = p;
    }

    public ArrayList<String> getArray(){
        return s;
    }   
    public void addListener(ChangeListener list){
        this.listener = list;
    }
}

您能否举例说明如何将Timer替换为SwingWorker

1 个答案:

答案 0 :(得分:2)

将addItem方法更改为以下内容:

private void addItem() {
    final String newString = new String("sampleText");
    s.add(newString);
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            // inserting new item to database
            b.insert(newString);
        }
    };
    new Thread(runnable).start();
    listener.stateChanged(new ChangeEvent(this));
}