swing - 单击 JButton 时 ViewPart 挂起

标签 swing swt swingworker

我正在从事 Teamcenter RAC 定制工作。我更改了处理 View 部分和 jbuttons 的现有代码。 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 下编写了代码,但没有成功。请求立即帮助。

最佳答案

“它挂起 teamcenter 应用程序”是什么意思?是否响应太慢或者doInBackground()没有正确执行?

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

SwingUtilities.invokeLater() 允许在稍后的某个时间点执行任务,顾名思义;但更重要的是,该任务将在 AWT 事件调度线程上执行。请参阅Invoke later API documentation了解详细信息。

关于 get():

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

注意:在事件分派(dispatch)线程上调用 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();
            }
        });

    }

关于swing - 单击 JButton 时 ViewPart 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51238804/

相关文章:

java - 复合中的 SWT 串联滚动条

swt - FormLayout、FormData 和控件

java - 如何用 Java 制作响应式 MVP Swing GUI?

java - 重绘缓冲图像

java - jbuttons 的波动

java - NoClassDefFoundError:无法初始化类 com.jidesoft.swing.JideSwingUtilities

java - Java中调用JTable.print()时是否可以设置左右边距的大小?

java - 你能帮我解决一些 SWT 列表布局和渲染问题吗

Java: Swing 计时器等待

java - 如何报告后台任务的进度?