No momento, estou criando um menu de contexto de clique com o botão direito instanciando um novo JMenu
clique com o botão direito e definindo sua localização para a posição do mouse ... Existe uma maneira melhor?
fonte
No momento, estou criando um menu de contexto de clique com o botão direito instanciando um novo JMenu
clique com o botão direito e definindo sua localização para a posição do mouse ... Existe uma maneira melhor?
Você provavelmente está chamando manualmente setVisible(true)
no menu. Isso pode causar um comportamento desagradável de erros no menu.
O show(Component, int x, int x)
método lida com todas as coisas que você precisa para acontecer, (destacando coisas ao passar o mouse e fechando o pop-up quando necessário) onde usar setVisible(true)
apenas mostra o menu sem adicionar nenhum comportamento adicional.
Para fazer um menu pop-up com o botão direito, basta criar um JPopupMenu
.
class PopUpDemo extends JPopupMenu {
JMenuItem anItem;
public PopUpDemo() {
anItem = new JMenuItem("Click Me!");
add(anItem);
}
}
Em seguida, tudo o que você precisa fazer é adicionar um personalizado MouseListener
aos componentes para os quais deseja que o menu seja exibido.
class PopClickListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger())
doPop(e);
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger())
doPop(e);
}
private void doPop(MouseEvent e) {
PopUpDemo menu = new PopUpDemo();
menu.show(e.getComponent(), e.getX(), e.getY());
}
}
// Then on your component(s)
component.addMouseListener(new PopClickListener());
Claro, os tutoriais têm uma explicação um pouco mais aprofundada .
Nota: Se você notar que o menu pop-up está aparecendo muito diferente de onde o usuário clicou, tente usar os métodos e.getXOnScreen()
e e.getYOnScreen()
para as coordenadas xey.
PopClickListener
estendeMouseAdapter
?component
significa?Esta pergunta é um pouco antiga - assim como as respostas (e o tutorial também)
A API atual para definir um popupMenu no Swing é
Desta forma, será mostrado automagicamente, tanto para gatilhos de mouse quanto de teclado (o último depende do LAF). Além disso, ele suporta a reutilização do mesmo pop-up nos filhos de um contêiner. Para ativar esse recurso:
fonte
JTable
para que apareça na linha selecionada ou na linha onde você clicar com o botão direito? Ou neste cenário o método antigo é o que deve ser escolhido?Há uma seção sobre como abrir um menu pop-up no artigo How to Use Menus dos Tutoriais Java que explica como usar a
JPopupMenu
classe.O código de exemplo no tutorial mostra como adicionar
MouseListener
s aos componentes que devem exibir um menu pop-up e exibe o menu de acordo.(O método que você descreve é bastante semelhante à maneira como o tutorial apresenta a maneira de mostrar um menu pop-up em um componente.)
fonte
O código a seguir implementa um menu de contexto padrão conhecido
Windows
com as funções copiar, cortar, colar, selecionar tudo, desfazer e refazer. Também funciona emLinux
eMac OS X
:Uso:
Agora, o
textArea
terá um menu de contexto quando for clicado com o botão direito.fonte
releasedEvent.isPopupTrigger()
vez dereleasedEvent.getButton() == MouseEvent.BUTTON3
funcionar corretamente em todas as plataformas.pressedEvent.getModifiersEx() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
devem ser ambosEx
ou nãoEx
. AEx
versão dogetMenuShortcutKeyMask()
está disponível apenas a partir do java 10+.Vou corrigir o uso desse método sugerido por @BullyWillPlaza. A razão é que, quando tento adicionar textArea apenas a contextMenu, ela não fica visível e, se eu adicionar a contextMenu e a alguns painéis, ela econtadores: Associação dupla de pai diferente se eu tentar mudar para o editor de design.
Torne o ouvinte do mouse como este para o objeto de texto que você precisa ter ativado. O que isso fará é quando você clicar com o botão direito em seu objeto de texto, ele adicionará esse pop-up e o exibirá. Dessa forma, você não encontrará esse erro. A solução que @BullyWillPlaza fez é muito boa, rica e rápida de implementar em seu programa, então você deve experimentar ou ver se gosta.
fonte