GVKun编程网logo

Java Swing JTable;右键单击菜单(如何使其“选择”又是突出显示行)(java swing菜单栏)

23

在这篇文章中,我们将带领您了解JavaSwingJTable;右键单击菜单的全貌,包括如何使其“选择”又是突出显示行的相关情况。同时,我们还将为您介绍有关c#–当您右键单击菜单项时如何显示上下文菜单、

在这篇文章中,我们将带领您了解Java Swing JTable;右键单击菜单的全貌,包括如何使其“选择”又是突出显示行的相关情况。同时,我们还将为您介绍有关c# – 当您右键单击菜单项时如何显示上下文菜单、Cocoa:当您右键单击NSTableView的单元格时,如何使用上下文菜单、delphi – 如何正确显示基于资源管理器的右键单击菜单、Java Swing JTable的知识,以帮助您更好地理解这个主题。

本文目录一览:

Java Swing JTable;右键单击菜单(如何使其“选择”又是突出显示行)(java swing菜单栏)

Java Swing JTable;右键单击菜单(如何使其“选择”又是突出显示行)(java swing菜单栏)

简短:我需要一个“右键单击事件”来突出显示单元格行。

我在Java Swing(Netbeans
Matisse)的ScrollPane中使用JTable。我在JTable上有一个MouseClicked事件侦听器,该侦听器执行以下操作:

if (evt.getButton() == java.awt.event.MouseEvent.BUTTON3) {          System.out.println("Right Click");          JPopUpMenu.show(myJTable, evt.getX(), evt.getY())}

问题是…每当我在JTable上单击鼠标右键时,该行都不会突出显示(我将选择设置为仅行行)。我已经寻找了几个setSelected()函数,但是找不到合适的函数。默认情况下,单击鼠标左键会自动突出显示该行。如何设置右键单击?

答案1

小编典典

像这样:

table.addMouseListener(new MouseAdapter() {    @Override    public void mouseReleased(MouseEvent e) {        int r = table.rowAtPoint(e.getPoint());        if (r >= 0 && r < table.getRowCount()) {            table.setRowSelectionInterval(r, r);        } else {            table.clearSelection();        }        int rowindex = table.getSelectedRow();        if (rowindex < 0)            return;        if (e.isPopupTrigger() && e.getComponent() instanceof JTable ) {            JPopupMenu popup = createYourPopUp();            popup.show(e.getComponent(), e.getX(), e.getY());        }    }});

......

c# – 当您右键单击菜单项时如何显示上下文菜单

c# – 当您右键单击菜单项时如何显示上下文菜单

我正在将一个MFC应用程序移植到.NET WinForms.在MFC应用程序中,您可以右键单击菜单或上下文菜单项,并显示另一个包含诊断和配置项的上下文菜单.我试图将这个功能移植到.NET,但是我遇到麻烦.

我已经能够捕获右键单击,禁用基本菜单的点击并弹出正确位置的上下文菜单,但是原始菜单会在失去焦点后立即消失.

在MFC中,通过使用TPM_RECURSE标志调用TrackPopupMenuEx来显示新的上下文菜单.

ContextMenu和.NET中的新的ContextMenuStrip类只有一个Show方法.有人知道如何在.NET中执行此操作?

编辑

我已经尝试通过p / invoke使用TrackPopupMenuEx,但是这限制了您使用ContextMenu而不是在我们的应用程序中不合适的ContextMenuStrip.它仍然不能正常工作.它不适用于新的MenuStrip和ContextMenuStrip.

我也尝试过子类化ToolStripMenuItem,看看我是否可以添加一个上下文菜单.这是为MenuStrip工作,但ContextMenuStrip仍然允许右键单击事件通过点击.

解决方法

编辑,由于评论:

在:

protected override void OnClick(EventArgs e)
{
    if (SecondaryContextMenu == null || MouseButtons != MouseButtons.Right)
    {
        base.OnClick(e);
    }
}

这部分

MouseButtons != MouseButtons.Right

应该和确实编译,因为它是一个调用Control.MouseButtons.由于Form继承Control类,所以直接调用MouseButtons属性就足够了.

希望这可以帮助:

public partial class Form1 : Form
{
    class CustomToolStripMenuItem : ToolStripMenuItem
    {
        private ContextMenuStrip secondaryContextMenu;

        public ContextMenuStrip SecondaryContextMenu
        {
            get
            {
                return secondaryContextMenu;
            }
            set
            {
                secondaryContextMenu = value;
            }
        }

        public CustomToolStripMenuItem(string text)
            : base(text)
        { }

        protected override void dispose(bool disposing)
        {
            if (disposing)
            {
                if (secondaryContextMenu != null)
                {
                    secondaryContextMenu.dispose();
                    secondaryContextMenu = null;
                }
            }

            base.dispose(disposing);
        }

        protected override void OnClick(EventArgs e)
        {
            if (SecondaryContextMenu == null || MouseButtons != MouseButtons.Right)
            {
                base.OnClick(e);
            }
        }
    }

    class CustomContextMenuStrip : ContextMenuStrip
    {
        private bool secondaryContextMenuActive = false;
        private ContextMenuStrip lastShownSecondaryContextMenu = null;

        protected override void dispose(bool disposing)
        {
            if (disposing)
            {
                if (lastShownSecondaryContextMenu != null)
                {
                    lastShownSecondaryContextMenu.Close();
                    lastShownSecondaryContextMenu = null;
                }
            }
            base.dispose(disposing);
        }

        protected override void OnControlAdded(ControlEventArgs e)
        {
            e.Control.MouseClick += new MouseEventHandler(Control_MouseClick);
            base.OnControlAdded(e);
        }

        protected override void OnControlRemoved(ControlEventArgs e)
        {
            e.Control.MouseClick -= new MouseEventHandler(Control_MouseClick);
            base.OnControlRemoved(e);
        }

        private void Control_MouseClick(object sender,MouseEventArgs e)
        {
            ShowSecondaryContextMenu(e);
        }

        protected override void OnMouseClick(MouseEventArgs e)
        {
            ShowSecondaryContextMenu(e);
            base.OnMouseClick(e);
        }

        private bool ShowSecondaryContextMenu(MouseEventArgs e)
        {
            CustomToolStripMenuItem ctsm = this.GetItemAt(e.Location) as CustomToolStripMenuItem;

            if (ctsm == null || ctsm.SecondaryContextMenu == null || e.Button != MouseButtons.Right)
            {
                return false;
            }

            lastShownSecondaryContextMenu = ctsm.SecondaryContextMenu;
            secondaryContextMenuActive = true;
            ctsm.SecondaryContextMenu.Closed += new toolstripdropdownClosedEventHandler(SecondaryContextMenu_Closed);
            ctsm.SecondaryContextMenu.Show(Cursor.Position);
            return true;
        }

        void SecondaryContextMenu_Closed(object sender,toolstripdropdownClosedEventArgs e)
        {
            ((ContextMenuStrip)sender).Closed -= new toolstripdropdownClosedEventHandler(SecondaryContextMenu_Closed);
            lastShownSecondaryContextMenu = null;
            secondaryContextMenuActive = false;
            Focus();
        }

        protected override void OnClosing(toolstripdropdownClosingEventArgs e)
        {
            if (secondaryContextMenuActive)
            {
                e.Cancel = true;
            }

            base.OnClosing(e);
        }
    }

    public Form1()
    {
        InitializeComponent();


        CustomToolStripMenuItem itemPrimary1 = new CustomToolStripMenuItem("item primary 1");
        itemPrimary1.SecondaryContextMenu = new ContextMenuStrip();
        itemPrimary1.SecondaryContextMenu.Items.AddRange(new ToolStripMenuItem[] { 
            new ToolStripMenuItem("item primary 1.1"),new ToolStripMenuItem("item primary 1.2"),});

        CustomToolStripMenuItem itemPrimary2 = new CustomToolStripMenuItem("item primary 2");
        itemPrimary2.DropDownItems.Add("item primary 2,sub 1");
        itemPrimary2.DropDownItems.Add("item primary 2,sub 2");
        itemPrimary2.SecondaryContextMenu = new ContextMenuStrip();
        itemPrimary2.SecondaryContextMenu.Items.AddRange(new ToolStripMenuItem[] { 
            new ToolStripMenuItem("item primary 2.1"),new ToolStripMenuItem("item primary 2.2"),});

        CustomContextMenuStrip primaryContextMenu = new CustomContextMenuStrip();
        primaryContextMenu.Items.AddRange(new ToolStripItem[]{
            itemPrimary1,itemPrimary2
        });

        this.ContextMenuStrip = primaryContextMenu;
    }
}

Cocoa:当您右键单击NSTableView的单元格时,如何使用上下文菜单

Cocoa:当您右键单击NSTableView的单元格时,如何使用上下文菜单

我有一个TableView与自定义单元格.我想要一个上下文菜单出现在用户右键单击(或其他任何其他Apple变体右键单击)在其中一个单元格(并知道他们点击的单元格).

我试图子类化NSTableView并覆盖这个方法:

- (NSMenu *)menuForEvent:(NSEvent *)theEvent;

但它永远不会被称为.

另一方面,

- (void)rightMouseDown:(NSEvent *)theEvent;

得到叫.但我不知道这是我们想要的.

更多细节:

//
//  PTTableView.m
// 
//
//  Created by Nathan Hazout on 5/31/11.
//  copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "PTTableView.h"


@implementation PTTableView

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (void)rightMouseDown:(NSEvent *)theEvent { 
    NSLog(@"entered rightMouseDown");
}

- (NSMenu *)menuForEvent:(NSEvent *)theEvent {
    NSLog(@"entered menuForEvent");
    return [super menuForEvent:theEvent];
}

- (NSView *)hitTest:(NSPoint)aPoint{
    NSLog(@"entered hitTest");
    return [super hitTest:aPoint];
}

- (void)dealloc
{
    [super dealloc];
}

@end

rightMouseDown被调用. hiTest被多次呼叫但是menuForEvent没有.

解决方法

没有必要处理事件,所有你需要做的分配一个上下文菜单是设置表视图的菜单插槽来指向要用于上下文菜单的NSMenu对象.

您可以在Interface Builder中通过将NSMenu对象放入nib文件中进行控制,并将其从表视图拖动到菜单以设置插座.

或者,您可以使用NSTableView(继承自NSResponder)的-setMenu:方法以编程方式分配菜单.

delphi – 如何正确显示基于资源管理器的右键单击菜单

delphi – 如何正确显示基于资源管理器的右键单击菜单

我使用Sertac Akyuz在这里回答的代码创建了这个菜单:
Show the default right-click menu – Delphi
 它运作良好,但有问题:
当我点击创建菜单时:删除(删除文件到回收) – 它问我:你确定要删除吗?

当我点击是 – 它工作正常,但当我点击否 – 它显示我的错误,
我在调试器中看到错误在线:

OleCheck(ContextMenu.InvokeCommand(CommandInfo));

Error: ###(gdb unparsed remainder:s 0x0 out of bounds>)###.

我使用Lazarus,但我认为,在Delphi中它也是实际的.

在我看来,菜单(窗口)尝试返回我的程序答案 – 不,并在这种情况下发生错误.

如何解决这个问题呢?如何正确解决这种情况并回答“否”?

解决方法

您尚未指定错误编号,但是当我尝试复制这些步骤时,OleCheck调用失败并显示0x80270000.保存错误位的高字部分是0x27(39),即’winerror.h’中定义的FACILTY_SHELL.如您所见,低位字为’0′,shell不提供任何特定的错误代码,实际上代码与ERROR_SUCCESS或NO_ERROR相同.

我的解释是,shell只是通知命令(删除操作)失败.失败是由于用户取消操作.我的建议是,根据需要相应地修改代码.您知道操作失败,但您可以选择忽略它,或者可能通知用户.也许是这样的:

var
  ...
  InvokeResult: HRESULT;
begin

  ...
//      OleCheck(ContextMenu.InvokeCommand(CommandInfo));
      InvokeResult := ContextMenu.InvokeCommand(CommandInfo);
      if not Succeeded(InvokeResult) then begin
        if LoWord(InvokeResult) = NO_ERROR then
          ShowMessage('Command did not carried out')
        else
          OleError(InvokeResult);
      end;
    ...

Java Swing JTable

Java Swing JTable

Table 排序,
按照序号排序,如果序号没有值可能是新增变量或是没有进行过排序设置,

这种情况默认放在最后显示,一般进行了排序设置,就要对这些变量设置相应的序号 , 并保存到数据库中。

关于Java Swing JTable;右键单击菜单如何使其“选择”又是突出显示行的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于c# – 当您右键单击菜单项时如何显示上下文菜单、Cocoa:当您右键单击NSTableView的单元格时,如何使用上下文菜单、delphi – 如何正确显示基于资源管理器的右键单击菜单、Java Swing JTable等相关知识的信息别忘了在本站进行查找喔。

本文标签: