搜索数据数组会产生一组可单击的结果按钮。我需要强制执行“ 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被点击
答案 0 :(得分:2)
在处理Swing或JavaFX时,切勿阻塞主线程,否则UI会冻结,这是不好的用户体验。查看此Oracle tutorial,了解如何在单独的线程上异步处理此类任务。
但是,在您的特定情况下,我认为这要简单得多。如果您想对用户单击某个按钮做出反应,那么只需在侦听器中执行您需要做的任何事情就更加有意义。为什么不在侦听器中实现逻辑,而不是尝试使所有内容都适合search
方法?这样,您的函数将立即返回,并且应用程序仅在用户单击时才对用户的单击做出反应,并且您不会冻结任何内容。
如果您确实需要与用户进行同步交互(即,在发生任何事情之前要求用户执行的操作),则可以像从用户那里收集搜索字符串一样使用“ Hovercraft Full”对话框进行操作鳗鱼指出。
作为附带说明,这里有一些技巧可使代码更易于推理,这将是解决问题的第一步: