如何使用卡片布局实现鼠标事件到标签

Posted

技术标签:

【中文标题】如何使用卡片布局实现鼠标事件到标签【英文标题】:how to implement mouseevents to labels using cardlayout 【发布时间】:2014-04-26 15:02:07 【问题描述】:

我正在尝试使用卡片布局对Jlabel 实现鼠标单击事件。我想要的是当我点击标签时标签菜单应该在左侧,另一个面板应该显示在右侧如何做到这一点我不想在这里使用按钮。

目前我收到这样的异常:

Exception in thread "main" java.lang.IllegalArgumentException: cannot add to        layout: constraint must be a string
    at java.awt.CardLayout.addLayoutComponent(CardLayout.java:190)
    at java.awt.Container.addImpl(Container.java:1068)
    at java.awt.Container.add(Container.java:352)
    at Remainder.<init>(Remainder.java:44)
    at Remainder.main(Remainder.java:110)

这是我的代码:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;

public class Remainder implements MouseListener
    JPanel panelchange1 = new JPanel();
    JPanel panelchange2 = new JPanel();
    CardLayout cardlayout = new CardLayout();
    JPanel p2 = new JPanel(new CardLayout());
    JLabel personal = new JLabel("Personal");
    JLabel personal2 = new JLabel("panel1");
    JLabel personal3 = new JLabel("panel2");
    JLabel d1 = new JLabel("Dairy");

    public  Remainder() 
        JSeparator sp1 = new JSeparator(JSeparator.VERTICAL);
        JFrame fm = new JFrame();
        //fm.addMouseListener(this);
        fm.getContentPane();
        //fm.setLayout(new BoxLayout());
        fm.setSize(880, 320);
        //fm.setResizable(false);
        fm.setVisible(true);
        fm.setLocationRelativeTo(null);

        JPanel p1 = new JPanel(new BorderLayout());
        fm.add(p1,BorderLayout.WEST);

        p2.setPreferredSize(new Dimension(850,300));
        fm.add(p2,BorderLayout.CENTER);
        p2.add(panelchange1);
        p2.add(panelchange2);
        p1.add(personal);

        personal.addMouseListener(this);
        p1.add(d1);

        d1.addMouseListener(this);
    

    public void mouseClicked(MouseEvent e) 
        if (e.getSource()==d1)
            cardlayout.next(p2);
            //JOptionPane.showMessageDialog(null, "yeah it works now");
        
        else if(e.getSource()==personal)
            panelchange2.add(personal2);
           //JOptionPane.showMessageDialog(null, "yeah it works too");
        
    

    public void mousePressed(MouseEvent e) 

    

    public void mouseReleased(MouseEvent e) 

    

    public void mouseEntered(MouseEvent e) 

    

    public void mouseExited(MouseEvent e) 

    

    public static void main(String args[]) 
        Remainder obj1 = new Remainder();
        //obj1.pane();
    

怎么办,我现在正在显示空白框?

【问题讨论】:

“我不想在这里使用按钮。” 通过解释原因让我们关心您“想要”什么。那么,..为什么? 如果它有助于解决问题,请accept 回答。 (如果没有,请您提供进一步的解释。) 【参考方案1】:

首先

您永远不会将cardlayout 分配给任何东西

CardLayout cardlayout = new CardLayout();
JPanel p2 = new JPanel(new CardLayout());

当您尝试换卡时,这将导致错误。相反,将您创建的CardLayout 实例应用到面板...

CardLayout cardlayout = new CardLayout();
JPanel p2 = new JPanel(cardlayout);

其次

CardLayout 要求您为每张卡提供一个名称...

改变

p2.add(panelchange1);
p2.add(panelchange2);

类似...

p2.add(panelchange1, "panel1");
p2.add(panelchange2, "panel2");

第三

看看

How to Use CardLayout Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? Initial Threads

更多详情...

【讨论】:

【参考方案2】:

阅读 How to Use a Card Layout 上的 Swing 教程部分。

您希望面板位于左侧/右侧,而本教程使用面板位于顶部/底部,但概念相同。

我不想在这里使用按钮。

您可以使用 JButton 并使用 setBorderPainted(false) 方法。然后按钮看起来像一个标签,但您仍然可以使用 ActionListener 来处理事件,而不是使用 MouseListener。

【讨论】:

【参考方案3】:

== 只能比较原语。 Object 类——因此,所有非原始对象也一样——具有比较两个对象的函数.equals()。因此,在您的 actionPerformed 方法中,您需要使用 e.getSource().equals(comparedObject) 查找触发对象。

【讨论】:

以上是关于如何使用卡片布局实现鼠标事件到标签的主要内容,如果未能解决你的问题,请参考以下文章

React鼠标事件

如何在 Java 中检测 Image 对象上的鼠标单击事件?

在html中怎么用js实现鼠标指向图片时图片放大到原图那么大?(具体实现)

在html中怎么用js实现鼠标指向图片时图片放大到原图那么大?(具体实现)

jquery鼠标经过事件

在 QT 中为图像标签创建鼠标事件