簡體   English   中英

每次單擊時創建一個新的JLabel實例

[英]Create new instance of JLabel each time it is clicked

我有一個帶有JLabelJPanel ,是否可以在JLabel單擊鼠標,然后再在JPanel上的任何位置單擊鼠標以創建JLabel的實例。 基本上,我可以單擊JLabel並在JPanel上的任何位置創建它的新實例。

這是您要尋找的簡單示例。 您需要單擊的JLabel deepCopy ,然后將其取回並將其繪制到JPanel
在此處輸入圖片說明

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();
            }
        });
    }
}

您可以像這樣將鼠標偵聽器附加到您的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並將其添加到目標面板

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM