- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经在 Google 上搜索了两天了,有点迷失了。
当右键单击被触发时,我可以轻松地触发一个事件。那不是问题。我的问题是,如果/当右键单击菜单在没有进行任何选择的情况下被关闭时,我还需要触发类似的事件。
这可以归结为业务需求:表中有一个项目列表,该表在最左边的列中有复选框以显示已选择哪些行。因为这些复选框是确定将处理哪些行的 UI 键,所以任何处理操作都会查看复选框的状态而不是已选择的行。
用户可以直接选择复选框以对一行或多行执行操作(通过窗口页脚中的按钮或通过右键单击菜单)。但是,还需要有一个选项,可以通过右键单击事件本身进行单个 Activity 选择,而不需要显式选中复选框。
在这种情况下,触发右键单击条目将自动检查该复选框(无论是否已被选中)。但是,如果用户决定不在该行上执行任何操作,则需要将该复选框恢复到其之前的状态(选中或取消选中,通过右键单击实现)。
通过仅引入原始状态,我不必关心原始状态,只需要在放弃右键单击时重新应用它即可。这使得选中和未选中的原始状态都可以成功恢复。从本质上讲,这允许意外的右键单击被取消,而不会每次都在该表格行中勾选复选框 - 这将是不受欢迎的行为。
不幸的是,我在互联网上没有找到任何示例来讨论针对右键单击菜单的解除以及如何将操作 Hook 到该事件中。
到目前为止我的代码是这样的:
private void setListenerForItemsTable() {
tblItems.addMouseListener( new MouseAdapter() {
public void mousePressed( MouseEvent evt ) {
if ( view.showMaybePopup( evt ) ) {
rightClickEvent(); // Fires needed code on right-click popup appearance.
}
}
public void mouseReleased( MouseEvent evt ) {
if ( view.showMaybePopup( evt ) ) {
rightClickEvent();
}
}
} );
}
这对于创建右键弹出窗口来说非常有效。它工作得非常好。
仅供引用,该代码还具有右键单击菜单本身的监听器,它允许处理右键单击菜单中的任何项目的选择:
private void setListenerForRightClickMenu() {
// Preview
mnuPreviewItem.addActionListener( (e)
-> {
previewItem();
} );
// Resend Fax
mnuResendItem.addActionListener( (e)
-> {
resendItem();
} );
/// etc...
}
但是,任何在右键单击菜单上使用类似于 addFocusListener
的尝试,就像将 addMouseListener
附加到表中一样,都会导致空指针异常;大概是因为在实际触发右键单击之前,右键单击菜单不可用。
建议?
最佳答案
简而言之,我的解决方案涉及向上面的 setListenerForItemsTable()
方法添加第二个监听器。特别是 addPopupMenuListener()
监听器:
tblItems.addPopupMenuListener( new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible( PopupMenuEvent evt ) {
// set checkbox
if( rightClickRow >= 0 ) {
mdlItems.setValueAt( true, rightClickRow, model.COL_CHECK );
}
}
@Override
public void popupMenuCanceled( PopupMenuEvent evt ) {
// return checkbox to prior value
if( rightClickRow >= 0 ) {
mdlItems.setValueAt( rightClickValue, rightClickRow, model.COL_CHECK );
}
}
} );
但是,有一个问题:如果表小于包含它的窗口,则您的右键单击实际上可能不会涉及主动选择的行(如果您在该区域内右键单击,但不在表本身的任何行上单击)。因此,您需要定位实际右键单击的任何行(如果存在的话),然后保存该行号及其复选框的当前状态(如果放弃右键单击,则用于反转)。
因此,在类的根部,我们设置了一些默认容器来保存这些值:
private Boolean rightClickValue = false;
private int rightClickRow = -1;
然后定位 addMouseListener()
来查看我们是否确实单击了一行,如果是,则记录它是哪一行以及其复选框的状态:
tblItems.addMouseListener( new MouseAdapter() {
@Override
public void mouseClicked( MouseEvent evt ) {
rightClickRow = tblItems.rowAtPoint( evt.getPoint() );
rightClickValue = mdlItems.getValueAt(rightClickRow, model.COL_CHECK) == Boolean.TRUE;
}
}
所以最后,我们有以下内容:
/**
* Listener to decide between showing right-click menu OR calling Preview Item after double clicking a row
*/
private void setListenerForItemsTable() {
tblItems.addMouseListener( new MouseAdapter() {
@Override
public void mouseClicked( MouseEvent evt ) {
isPreview( evt );
}
@Override
public void mousePressed( MouseEvent evt ) {
processRightClick( evt );
}
@Override
public void mouseReleased( MouseEvent evt ) {
processRightClick( evt );
}
} );
itmMenu.addPopupMenuListener( new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible( PopupMenuEvent evt ) {
processCheckbox( true );
}
@Override
public void popupMenuWillBecomeInvisible( PopupMenuEvent evt ) {
// do nothing
}
@Override
public void popupMenuCanceled( PopupMenuEvent evt ) {
processCheckbox( rightClickValue );
}
} );
}
/**
* Checks whether a preview of the line item is warranted, and provides it
*
* @param evt
*/
private void isPreview( MouseEvent evt ) {
if ( isRow( evt ) && isDblClick( evt ) ) {
previewItem();
}
}
/**
* Checks if the item that was clicked on was a viable table row or not
*
* @param evt the MouseEvent
*
* @return Boolean
*/
private Boolean isRow( MouseEvent evt ) {
return getClickedRow( evt ) >= 0;
}
/**
* Checks if the click action was a double click or not
*
* @param evt the MouseEvent
*
* @return Boolean
*/
private Boolean isDblClick( MouseEvent evt ) {
return evt.getClickCount() == 2;
}
/**
* Gets the index of the table row that was clicked on
*
* @param evt the MouseEvent
*
* @return Integer
*/
private Integer getClickedRow( MouseEvent evt ) {
return tblItems.rowAtPoint( evt.getPoint() );
}
/**
* Bringing everything together: storing the row index and value of the checkbox, and triggering the pop-up menu
*
* @param evt the MouseEvent
*/
private void processRightClick( MouseEvent evt ) {
int row = getClickedRow( evt );
if ( row >= 0 ) {
rightClickRow = row;
rightClickValue = ( Boolean.TRUE ).equals( mdlItems.getValueAt( row, model.COL_CHECK ) );
}
view.showMaybePopup( evt );
}
/**
* Setting or unsetting the checkbox in the active row
*
* @param value the desired value to apply to the checkbox
*/
private void processCheckbox( Boolean value ) {
if ( rightClickRow >= 0 ) {
mdlItems.setValueAt( value, rightClickRow, model.COL_CHECK );
}
}
关于Java Swing : how to fire an event when a right-click menu gets *dismissed* without a selection having been made?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55009202/
在 的 React 组件中菜单,我需要设置selected反射(reflect)应用程序状态的选项的属性。 在 render() , optionState从状态所有者传递给 SortMenu 组件
我是初级 Ruby-mysql 程序员,我想知道如何使我的(存储过程)查询结果更快.. 这是我的存储过程我正在使用 SQL_CACHE.. 但我不确定.. 缓存使我的过程更快.. : ( DROP
我一直在 Python 中进行套接字编程,以使用 select.select(rfile, wfile, xlist[, timeout]) 处理由已连接的客户端套接字列表发出的请求,并且我还想用 J
我试图通过用空格填充文本来创建下拉列表中的列效果,如下例所示: [Aux1+1] [*] [Aux1+1] [@Tn=PP] [Main] [*] [Main A
我为 MySQL 编写了以下查询: SELECT subquery.t1_column1, subquery.t2_id, MAX(subquery.val) FROM ( S
为什么我们要用 select 标签来编写.attr('selected','selected') 例如: $('#countryList option').filter(function () {
Lokalizacja: Gdańsk Rzeszów Wrocław 不知道发生了什么,但在那种情况下没有选择的选项,我必须从列表中选择一些东西。当我从选
我的表单中有两个选择字段。第一个是单选,另一个是多选。现在我想做的是根据单选中所选的选项,使用给定的数据选择多选中的选项。为此,我在单选更改时触发 ajax 请求: $.ajax({ type
我在 Firefox 5 中发现了一个奇怪的错误(我现在无法访问 4)。但是,我认为它可能在 Firefox 4 中工作,因为我刚买了一台新电脑,而且我不记得以前见过这个错误。 我有几个选择框。所选值
此 SQL 有何不同: 第一个: select * from table_1 a join table_2 b on a.id = b.acc_id 第二个: select * f
预选 的最佳做法是什么?在 ? 根据不同的网站,两者都有效。但是哪个更好呢?最兼容? Foo Bar 最佳答案 如果您正在编写 XHTML,则 selected="selected" 是必需的。 如
我使用 Angular JS 创建了一个多选选择框:下面是相同的代码: JS: $scope.foobars = [{ 'foobar_id': 'foobar01', 'name':
我在 jqGrid 中有几列 edittype="select"。如何读取特定行中当前选定值的选项值? 例如:当我提供以下选项时,如何获得 FedEx 等的“FE” editoption: { val
这是我更大问题的精简查询,但要点是我试图内部联接到一个选择,其中选择受到外部选择的限制。那可能吗?我在内部选择上收到有关多部分标识符 S.Item 和 S.SerialNum 的错误。 要点是这样的,
如果chat.chat_type IS NULL,我想选择user.*,但如果chat.chat_type = 1 我想选择组。* SELECT CASE WHEN ch
我正在编写一个小脚本来测试表单在提交之前是否已被更改。所以我可以使用普通输入(文本、文本区域等): if(element.defaultValue != element.value) { al
我正在尝试为 Prototype 编写一个插件,用户在其中单击下拉菜单并将其替换为多选元素。我快完成了。在用户选择他们想要显示的内容并将表单提交到同一页面之前,一切都很好。我正在使用 PHP 来使用
你如何在 MongoDB 中进行嵌套选择,类似于 SELECT id FROM table1 WHERE id IN (SELECT id FROM table2) 最佳答案 MongoDB 尚不具备
我有以下用于选择下拉列表的代码: {{unit.Text}} UnitOfMeasurements 数组中的每一项看起来像这样: Selected: false Text: "lb" Va
我正在尝试使用[选定]和[ngValue]来设置表单中包含对象的选择标记的默认值。但出于某种原因,它们似乎无法相提并论。。示例代码:。这段代码最终只显示空白作为缺省值。如果删除[ngValue],它就
我是一名优秀的程序员,十分优秀!