如何暂停/等待返回

时间:2019-08-17 21:16:51

标签: java

搜索数据数组会产生一组可单击的结果按钮。我需要强制执行“ return recordNumber”;等待执行,直到单击其中一个结果,以便返回可以返回适当的recNo。

每次我尝试实现wait()notify()时,结果按钮面板都无法填充

 public int Search() throws InterruptedException
 {
    JFrame searchFrame = new JFrame();
    JPanel searchPanel = new JPanel();
    searchPanel.setLayout( new BoxLayout( searchPanel, BoxLayout.Y_AXIS ) );
    resultsButton = new JButton[ recordCount ];
    resultsRecNo = new int[ recordCount ];
    searchString = JOptionPane.showInputDialog( this, "Search for", "" );
    System.out.println( " searchString = "+searchString );
    resultNo = 0;
    if ( searchString != null && searchString.isEmpty() == false  )
    {
       offset = 0;
       for ( recNo = 0; recNo < recordCount; recNo++ )
       {
           byteArray = Arrays.copyOfRange( dataArray, offset, offset+recordSize );
           tmp = new String( byteArray );
           found = tmp.toLowerCase().contains( searchString.toLowerCase() );
           if ( found == true )
           {
               resultsRecNo[ resultNo ] = recNo + 1;
               resultsButton[ resultNo ] = new JButton( "recNo"+(recNo+1)+" : "+tmp );
// create results buttons
               resultsButton[ resultNo ].addActionListener( new ActionListener() { int getRecNo = resultsRecNo[ resultNo ]; public void actionPerformed( ActionEvent e ) { setRecord( getRecNo ); searchFrame.dispatchEvent(new WindowEvent(searchFrame, WindowEvent.WINDOW_CLOSING)); } } );
               searchPanel.add( resultsButton[ resultNo ] );
               resultNo++;
           }
           offset = offset + recordSize;
       }
       if ( resultNo == 0 )
       {
           resultsButton[ resultNo ] = new JButton( " No Results Found " );
           resultsButton[ resultNo ].addActionListener( new ActionListener() { int getRecNo = 0; public void actionPerformed( ActionEvent e ) { setRecord( getRecNo ); searchFrame.dispatchEvent(new WindowEvent(searchFrame, WindowEvent.WINDOW_CLOSING)); } } );
           searchPanel.add( resultsButton[ resultNo ] );
       }
       JScrollPane resultsScrollPane = new JScrollPane( searchPanel );
       resultsScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
       resultsScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
       resultsScrollPane.setLayout(new ScrollPaneLayout());
       searchFrame.add( resultsScrollPane );
       searchFrame.setSize( frameWidth, frameHeight );
       searchFrame.setVisible( true );
   }
   System.out.println( "getRecNo = "+getRecNo+" : recordNumber = "+recordNumber );
   return recordNumber;
 } /////////////////////////// End Of Method Search()

 public void setRecord( int recno)
 {
    recordNumber = recno;
    System.out.println("setRecord : "+recordNumber);
 }

我需要返回recordNumber才能等到其中一个resultButton被点击

1 个答案:

答案 0 :(得分:2)

在处理Swing或JavaFX时,切勿阻塞主线程,否则UI会冻结,这是不好的用户体验。查看此Oracle tutorial,了解如何在单独的线程上异步处理此类任务。

但是,在您的特定情况下,我认为这要简单得多。如果您想对用户单击某个按钮做出反应,那么只需在侦听器中执行您需要做的任何事情就更加有意义。为什么不在侦听器中实现逻辑,而不是尝试使所有内容都适合search方法?这样,您的函数将立即返回,并且应用程序仅在用户单击时才对用户的单击做出反应,并且您不会冻结任何内容。

如果您确实需要与用户进行同步交互(即,在发生任何事情之前要求用户执行的操作),则可以像从用户那里收集搜索字符串一样使用“ Hovercraft Full”对话框进行操作鳗鱼指出。

作为附带说明,这里有一些技巧可使代码更易于推理,这将是解决问题的第一步:

  • 您似乎有大量的全局变量。这不好,请尝试使状态尽可能少,甚至没有。
  • 不要将听众写在一行上,这是不可读的
  • 将您的方法拆分为约5到15行的较小的具有好名字的行