我正在尝试使用卡片布局向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();
}
}
如何做到这一点,我现在正在显示空白框架?
答案 0 :(得分:3)
您永远不会将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");
看看
了解更多详情......
答案 1 :(得分:2)
阅读How to Use a Card Layout上的Swing教程中的部分。
你想要左/右面板,教程使用顶部/底部的面板,但概念是相同的。
我不想在这里使用按钮。
您可以使用JButton并使用setBorderPainted(false)
方法。然后该按钮看起来像一个标签,但您仍然可以使用ActionListener来处理事件,而不是使用MouseListener。
答案 2 :(得分:0)
==
只能比较基元。因此,Object
类──所有非原始对象──都有一个比较两个对象的函数.equals()
。因此,在actionPerformed
方法中,您希望使用e.getSource().equals(comparedObject)
查找触发对象。