有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java会在每次单击JLabel时创建新的实例

我有一个JPanel,里面有一个JLabel,可以用鼠标点击JLabel,然后再用鼠标点击JPanel上的任何位置来创建JLabel的实例。基本上,我可以单击JLabel并在JPanel上的任何位置创建它的新实例


共 (2) 个答案

  1. # 1 楼答案

    您可以像这样将鼠标侦听器连接到JLabel

       final JLabel jlabel = new JLabel("Test");
        jlabel.addMouseListener(new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("Hello : "+ e);
                Point location = MouseInfo.getPointerInfo().getLocation();
                targetPanel.add(cloneLabelAt(jlabel, location)); 
            }
        });
    
    
    private JLabel cloneLabelAt(JLabel label, Point location)
    {
        JLabel cloned  = new JLabel(label.getText());
        cloned.setLocation(location);
        return cloned;
    }
    

    在鼠标单击处理程序中,您可以创建另一个JLabel并将其添加到目标面板中

  2. # 2 楼答案

    下面是一个简单的例子,说明你在寻找什么。您需要的是deepCopy单击的JLabel,然后检索它并将其绘制到JPanel
    enter image description here

    import javax.swing.*;
    import java.awt.event.*;
    import java.io.*;
    import java.awt.*;
    import javax.swing.border.*;
    class CopyLabel extends JFrame
    {
    
        JPanel panel ;
        JPanel centerPanel;
        int clickCount = 0;
        ByteArrayOutputStream baos;
        ByteArrayInputStream bins;
        public void createAndShowGUI()
        {
            setTitle("Copy JLabel");
            JLabel label1  = new JLabel("JLabel1");
            JLabel label2  = new JLabel("JLabel2");
            panel = new JPanel();
            label1.setForeground(Color.blue);
            label2.setForeground(Color.red);
            panel.add(label1);
            panel.add(label2);
            class MyMouseAdapter extends MouseAdapter
            {
                @Override
                public void mouseClicked(MouseEvent evt)
                {
                    clickCount = 1;
                    try
                    {
                        deepCopy((JLabel)evt.getSource());
                    }
                    catch (Exception ex){}
                }
            }
            label1.addMouseListener(new MyMouseAdapter());
            label2.addMouseListener(new MyMouseAdapter());
            panel.setBorder(BorderFactory.createTitledBorder("Controllers"));
            getContentPane().add(panel,BorderLayout.SOUTH);
            centerPanel = new JPanel();
            centerPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createRaisedBevelBorder(),"Drawing Pad",TitledBorder.CENTER,TitledBorder.TOP));
            centerPanel.setLayout(null);
            centerPanel.addMouseListener(new MouseAdapter()
            {
                @Override
                public void mouseClicked(MouseEvent evt)
                {
                    if (clickCount == 1)
                    {
                        try
                        {
                            pasteLabel(evt.getX(),evt.getY());
                        }
                        catch (Exception ex){}
                    }
                }
            });
            getContentPane().add(centerPanel);
            setSize(300,400);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);
        }
        public void deepCopy(JLabel label)throws Exception
        {
            baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(label);
            oos.close();
        }
        public void pasteLabel(int x, int y)throws Exception
        {
            if (clickCount == 1)
            {
                bins = new ByteArrayInputStream(baos.toByteArray());
                ObjectInputStream oins = new ObjectInputStream(bins);
                JLabel obj = (JLabel)oins.readObject();
                centerPanel.add(obj);
                obj.setBounds(x,y,obj.getWidth(),obj.getHeight());
            }
        }
        public static void main(String[] args) 
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {
                    CopyLabel cl = new CopyLabel();
                    cl.createAndShowGUI();
                }
            });
        }
    }