Java 添加鼠标侦听器后无法单击选项卡
我一直在尝试向JTabbedPane的选项卡标题添加一个弹出菜单,我成功地做到了以下几点:Java 添加鼠标侦听器后无法单击选项卡,java,swing,tabs,jtabbedpane,Java,Swing,Tabs,Jtabbedpane,我一直在尝试向JTabbedPane的选项卡标题添加一个弹出菜单,我成功地做到了以下几点: tabbedPane.setTabComponentAt(a+2, x); x.addMouseListener(new MouseListener() { @Override public void mouseReleased(MouseEvent e) { maybeShowPopup
tabbedPane.setTabComponentAt(a+2, x);
x.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseClicked(MouseEvent e) {}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popUpMenuTab.show(e.getComponent(),
e.getX(), e.getY());
}
}
});
但是,如果右键单击,则会出现上下文菜单,但如果左键单击,则不会出现任何情况。有人知道我如何将原始功能恢复到选项卡上,使其在左键单击时变为活动,但在右键单击时也有关联菜单
SSCCE如下所示
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTabbedPane;
public class JTabbedPaneDemoextends JPanel {
private JPopupMenu menu = new JPopupMenu();
public JTabbedPaneDemo() {
ImageIcon icon = new ImageIcon("java-swing-tutorial.JPG");
JTabbedPane jtbExample = new JTabbedPane();
JPanel jplInnerPanel1 = createInnerPanel("Tab 1 Contains Tooltip and Icon");
jtbExample.addTab("One", icon, jplInnerPanel1, "Tab 1");
jtbExample.setSelectedIndex(0);
JPanel jplInnerPanel2 = createInnerPanel("Tab 2 Contains Icon only");
jtbExample.addTab("Two", icon, jplInnerPanel2);
JPanel jplInnerPanel3 = createInnerPanel("Tab 3 Contains Tooltip and Icon");
jtbExample.addTab("Three", icon, jplInnerPanel3, "Tab 3");
JPanel jplInnerPanel4 = createInnerPanel("Tab 4 Contains Text only");
jtbExample.addTab("Four", jplInnerPanel4);
menu.add(new JMenuItem("Item 1"));
menu.add(new JMenuItem("Item 2"));
JLabel tab4Label = new JLabel();
tab4Label.setText("Four");
jtbExample.setTabComponentAt(3, tab4Label);
tab4Label.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseClicked(MouseEvent e) {}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
menu.show(e.getComponent(),
e.getX(), e.getY());
}
}
});
//Add the tabbed pane to this panel.
setLayout(new GridLayout(1, 1));
add(jtbExample);
}
protected JPanel createInnerPanel(String text) {
JPanel jplPanel = new JPanel();
JLabel jlbDisplay = new JLabel(text);
jlbDisplay.setHorizontalAlignment(JLabel.CENTER);
jplPanel.setLayout(new GridLayout(1, 1));
jplPanel.add(jlbDisplay);
return jplPanel;
}
public static void main(String[] args) {
JFrame frame = new JFrame("TabbedPane Source Demo");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);}
});
frame.getContentPane().add(new JTabbedPaneDemo(),
BorderLayout.CENTER);
frame.setSize(400, 125);
frame.setVisible(true);
}
}
在这里,您可以左键单击选项卡4,但不能右键单击。这是我的解决方案:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTabbedPane;
public class JTabbedPaneDemo extends JPanel {
private JPopupMenu menu = new JPopupMenu();
private JTabbedPane jtbExample;
public JTabbedPaneDemo() {
ImageIcon icon = new ImageIcon("java-swing-tutorial.JPG");
jtbExample = new JTabbedPane();
JPanel jplInnerPanel1 = createInnerPanel("Tab 1 Contains Tooltip and Icon");
jtbExample.addTab("One", icon, jplInnerPanel1, "Tab 1");
jtbExample.setSelectedIndex(0);
JPanel jplInnerPanel2 = createInnerPanel("Tab 2 Contains Icon only");
jtbExample.addTab("Two", icon, jplInnerPanel2);
JPanel jplInnerPanel3 = createInnerPanel("Tab 3 Contains Tooltip and Icon");
jtbExample.addTab("Three", icon, jplInnerPanel3, "Tab 3");
JPanel jplInnerPanel4 = createInnerPanel("Tab 4 Contains Text only");
jtbExample.addTab("Four", jplInnerPanel4);
menu.add(new JMenuItem("Item 1"));
menu.add(new JMenuItem("Item 2"));
JLabel tab4Label = new JLabel();
tab4Label.setText("Four");
jtbExample.setTabComponentAt(3, tab4Label);
tab4Label.addMouseListener(new TabbedMouseListener(3));
// Add the tabbed pane to this panel.
setLayout(new GridLayout(1, 1));
add(jtbExample);
}
protected JPanel createInnerPanel(String text) {
JPanel jplPanel = new JPanel();
JLabel jlbDisplay = new JLabel(text);
jlbDisplay.setHorizontalAlignment(JLabel.CENTER);
jplPanel.setLayout(new GridLayout(1, 1));
jplPanel.add(jlbDisplay);
return jplPanel;
}
/**
*
* Mouselistener for the Tabbedpane
*
*/
class TabbedMouseListener extends MouseAdapter {
private final int index;
/**
* Constructor
*
* @param index
* the index of the tab
*/
public TabbedMouseListener(int index) {
this.index = index;
}
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
menu.show(e.getComponent(), e.getX(), e.getY());
}
else {
jtbExample.setSelectedIndex(index);
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("TabbedPane Source Demo");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.getContentPane().add(new JTabbedPaneDemo(), BorderLayout.CENTER);
frame.setSize(400, 125);
frame.setVisible(true);
}
}
作为一个班级,我为听众做了一个演讲。声明侦听器时,可以将选项卡的索引作为参数。我还对选项卡窗格进行了全局更新:巧合的是,这个答案使用了与@Neifen相同的方法,但这个示例可能值得保留 设置选项卡式窗格模型的选定索引似乎有效:
getModel().setSelectedIndex(3)
。我已经更新了您的示例,使其使用事件调度线程,并通过使其自包含而成为一个示例
为了更快地获得更好的帮助,请发布一个。不确定如何在SSCCE上发布您发布的内容不是SSCCE。你对SSCCE上链接文档的哪一部分理解有困难?我想他可能会想在每个选项卡上创建一个弹出菜单,这就是为什么我让侦听器访问一个对象。但我认为这两个例子都是正确的。
MouseAdapter
的+1。你可能想从新开始。请随意克隆我的UIManager
图标。我敦促海报接受这个答案。你的意思是:SwingUtilities.invokeAndWait(……
),然后在里面:JFrame-frame=new-JFrame…
?是的;我在我的变体的main()
中做了类似的事情。
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;
/** @see https://stackoverflow.com/questions/7818752 */
public class JTabbedPaneDemo extends JPanel {
private JPopupMenu menu = new JPopupMenu();
public JTabbedPaneDemo() {
Icon icon = UIManager.getIcon("html.pendingImage");
final JTabbedPane jtb = new JTabbedPane();
JPanel jplInnerPanel1 = createInnerPanel("Tab 1: Tooltip and Icon");
jtb.addTab("One", icon, jplInnerPanel1, "Tab 1");
jtb.setSelectedIndex(0);
JPanel jplInnerPanel2 = createInnerPanel("Tab 2: Icon only");
jtb.addTab("Two", icon, jplInnerPanel2);
JPanel jplInnerPanel3 = createInnerPanel("Tab 3: Tooltip and Icon");
jtb.addTab("Three", icon, jplInnerPanel3, "Tab 3");
JPanel jplInnerPanel4 = createInnerPanel("Tab 4: Text only");
jtb.addTab("Four", jplInnerPanel4);
menu.add(new JMenuItem("Item 1"));
menu.add(new JMenuItem("Item 2"));
JLabel tab4Label = new JLabel();
tab4Label.setText("Four");
jtb.setTabComponentAt(3, tab4Label);
tab4Label.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
jtb.getModel().setSelectedIndex(3);
if (e.isPopupTrigger()) {
menu.show(e.getComponent(), e.getX(), e.getY());
}
}
});
setLayout(new GridLayout());
add(jtb);
}
private JPanel createInnerPanel(String text) {
JPanel jplPanel = new JPanel();
JLabel jlbDisplay = new JLabel(text);
jlbDisplay.setHorizontalAlignment(JLabel.CENTER);
jplPanel.setLayout(new GridLayout(1, 1));
jplPanel.add(jlbDisplay);
return jplPanel;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("TabbedPane Source Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JTabbedPaneDemo());
frame.pack();
frame.setSize(400, 125);
frame.setVisible(true);
}
});
}
}