ViewPart挂在JButton的单击上

时间:2018-07-09 05:39:26

标签: swing swt swingworker

我正在研究Teamcenter RAC定制。我已经更改了一个现有的代码,该代码可以处理viewpart和jbutton。 viewpart(SWT)加载样式表渲染面板。问题是,每当我单击保存按钮(JButton)时,这都会将Teamcenter应用程序挂在执行后的活动上。 代码如下:

saveCheckOutButton.addActionListener( new ActionListener()
        {
            @Override
            public void actionPerformed( ActionEvent paramAnonymousActionEvent )
            {
                final AbstractRendering sheetPanel = itemPanel.getStyleSheetPanel();
                final AbstractRendering sheetPanel1 = itemRevPanel.getStyleSheetPanel();
                SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {

                    @Override
                    protected Void doInBackground()
                        throws Exception
                    {
                        if(pPanel==null)
                            return null;
                        if( pPanel.isPanelSavable())
                        {

                            if(sheetPanel==null|| sheetPanel1==null)
                                return null;

                            sheetPanel.saveRendering();
                            sheetPanel1.saveRendering(); 
                            /*if(!sheetPanel.getErrorFlag() && !sheetPanel1.getErrorFlag())
                            {
                              sheetPanel.setModifiable( false );
                              sheetPanel1.setModifiable( false );
                            }*/
                        }
                        return null;
                    }
                    @Override
                    protected void done(){
                        if(!sheetPanel.getErrorFlag() && !sheetPanel1.getErrorFlag())
                        {
                          sheetPanel.setModifiable( false );
                          sheetPanel1.setModifiable( false );
                        }
                    }
                };

                worker.execute(); 

            }
        } );

我已经按照一些专家的建议在swingworker下编写了代码,但没有成功。请求一些即时帮助。

1 个答案:

答案 0 :(得分:1)

“挂起teamcenter应用程序”是什么意思。它响应太慢还是doInBackground()不能正确执行?

无论如何,您都可以尝试在SwingUtilities.invokeLater()中执行渲染代码,并使用方法get()。如果您未在done方法中调用get(),则将丢失doInBackground()中的计算引发的所有异常。因此,我们将了解异常是否存在。

顾名思义,

SwingUtilities.invokeLater()允许在以后的某个时间点执行任务。但更重要的是,该任务将在AWT事件分配线程上执行。有关详细信息,请参见Invoke later API documentation

关于get():

在必要时等待计算完成,然后检索其结果。

注意:在事件调度线程上调用get会阻止所有事件(包括重绘)都被处理,直到此SwingWorker完成为止。

saveCheckOutButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent paramAnonymousActionEvent) {
                final AbstractRendering sheetPanel = itemPanel.getStyleSheetPanel();
                final AbstractRendering sheetPanel1 = itemRevPanel.getStyleSheetPanel();
                SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {

                    @Override
                    protected Void doInBackground() throws Exception {
                        if (pPanel == null)
                            return null;
                        if (pPanel.isPanelSavable()) {
                            if (sheetPanel == null || sheetPanel1 == null)
                                return null;

                            saveRendering();
                        }
                        return null;
                    }

                    @Override
                    protected void done() {
                        try {
                            get();
                            if (!sheetPanel.getErrorFlag() && !sheetPanel1.getErrorFlag()) {
                                sheetPanel.setModifiable(false);
                                sheetPanel1.setModifiable(false);
                            }
                        } catch (final InterruptedException ex) {
                            throw new RuntimeException(ex);
                        } catch (final ExecutionException ex) {
                            throw new RuntimeException(ex.getCause());
                        }

                    }
                };
                worker.execute();
            }
        });



        private void saveRendering() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                sheetPanel.saveRendering();
                sheetPanel1.saveRendering();
            }
        });

    }