我有一個JPanel
在它JLabel
時間,是有可能有一個鼠標點擊JLabel
,通過對JPanel
任何位置再次用鼠標單擊下面創建的實例JLabel
。基本上,我可以單擊JLabel
並在JPanel
上的任意位置創建新實例。創建新實例的JLabel的每次點擊
回答
這裏是你一個簡單的例子正在找。你需要的是點擊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可移動,可以做些什麼? – CDX 2013-03-19 22:16:12
您可以通過鼠標監聽器連接到您的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並將其添加到您的目標板
雖然技術是正確的,但有兩件事情在我身上跳動,1-不需要調用super,因爲MouseAdapter從MouseListener和MouseMotionListener創建空方法(沒什麼大不了的),2-爲了真正回答這個問題,你會需要能夠克隆被點擊的對象和克隆引用到目標容器上的位置(當我閱讀它時,在與第二次點擊相同的位置)。這個問題可能不是關於鼠標聽衆,但這只是我的馴服 – MadProgrammer 2013-03-19 20:50:04
是的,我想在第二次鼠標點擊的位置有克隆參考,這怎麼可以做? – CDX 2013-03-19 21:01:35
您可以使用MouseInfo.getPointerInfo()。getLocation() – Greg 2013-03-19 21:05:12
- 1. startActivity每次創建Activity的新實例
- 2. 創建createjs對象的新實例每次都返回相同的實例
- 3. 創建每個實例的新文件
- 4. 每次點擊一個按鈕創建新的隨機句子
- 5. 不想每次都創建一個新的實例嗎?
- 6. 在每次運行時都創建了BackgroundTasks的新實例嗎?
- 7. 每次android都通過Intent創建新的實例活動?
- 8. 在每次迭代中創建Campaign的新實例
- 9. `auto`每次都創建一個新的變量實例?
- 10. 運算符++(int x)是否每次都創建新的實例?
- 11. 爲什麼Rectangle.Size在每次調用時創建新的實例?
- 12. 創建線程每次的新實例,我想運行與否
- 13. 在循環中創建JLabel和actionlistener的新實例
- 14. 通過點擊jlabel創建活動
- 15. 每次新的點擊新動作
- 16. 用按鈕點擊創建一個Imagebutton的新實例
- 17. 是否每次調用新的Handler(Looper.getMainLooper())創建它的新實例?
- 18. 每次點擊一個按鈕創建一個新窗體
- 19. MediaBrowserServiceCompat實例每次運行時更改都會重新創建
- 20. 每次點擊更新的日期
- 21. 新的精靈動畫每次點擊
- 22. 每次點擊時添加一個新的影片剪輯實例
- 23. 每次生成ViewController的新實例
- 24. 每次都有新的實例嗎?
- 25. 創建KClass的新實例
- 26. Weld @Inject ApplicationScope bean在每個注入點創建新實例
- 27. ViewScoped bean重新創建,每次我點擊我的數據表中的commandButton
- 28. ExecutorService - 在方法中創建新實例vs每個類創建一個實例
- 29. VBA - 命令按鈕點擊子 - 當工作表中創建新的每次
- 30. 如何在每次點擊同一個按鈕時創建一個新的textView?
問題是什麼? – CAMOBAP 2013-03-19 20:43:40
如果問題是「是否有可能?」好的。 – Aboutblank 2013-03-19 20:45:00
任何想法如何我可以去創建? – CDX 2013-03-19 21:02:10