2013-03-19 71 views
0

我有一个JPanel在它JLabel时间,是有可能有一个鼠标点击JLabel,通过对JPanel任何位置再次用鼠标单击下面创建的实例JLabel。基本上,我可以单击JLabel并在JPanel上的任意位置创建新实例。创建新实例的JLabel的每次点击

+0

问题是什么? – CAMOBAP 2013-03-19 20:43:40

+0

如果问题是“是否有可能?”好的。 – Aboutblank 2013-03-19 20:45:00

+0

任何想法如何我可以去创建? – CDX 2013-03-19 21:02:10

回答

2

这里是你一个简单的例子正在找。你需要的是点击JLabeldeepCopy,然后将其恢复并将其绘制到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(); 
      } 
     }); 
    } 
} 
+0

谢谢!这有帮助!如果我想让绘图板中的JLabel可移动,可以做些什么? – CDX 2013-03-19 22:16:12

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

虽然技术是正确的,但有两件事情在我身上跳动,1-不需要调用super,因为MouseAdapter从MouseListener和MouseMotionListener创建空方法(没什么大不了的),2-为了真正回答这个问题,你会需要能够克隆被点击的对象和克隆引用到目标容器上的位置(当我阅读它时,在与第二次点击相同的位置)。这个问题可能不是关于鼠标听众,但这只是我的驯服 – MadProgrammer 2013-03-19 20:50:04

+0

是的,我想在第二次鼠标点击的位置有克隆参考,这怎么可以做? – CDX 2013-03-19 21:01:35

+0

您可以使用MouseInfo.getPointerInfo()。getLocation() – Greg 2013-03-19 21:05:12

相关问题