2014-03-19 58 views
0

我一直在嘗試從剪貼板傳輸圖像(繪圖)到JTextPane或JTextArea。 附加的代碼正確顯示這些窗口中的圖像,但只要我將光標從窗口移開,圖像就會消失。我該如何修復JText中的圖像...?我的代碼中顯然缺少一些東西。我的網絡搜索沒有產生任何有用的東西。我沒有C#這個問題。我非常感謝你的幫助。圖像不留在Java中的JTextPane

private void jTextPaneStructuresMouseClicked(java.awt.event.MouseEvent evt)  {             

    TransferImage.TransferableImage newImage = new TransferImage.TransferableImage(image); 

     transferable = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); 

     if (transferable != null && transferable.isDataFlavorSupported(DataFlavor.imageFlavor)) { 
      try { 
       image = (Image)transferable.getTransferData(DataFlavor.imageFlavor); 
       Image cpImage = newImage.getTransferData(DataFlavor.imageFlavor); 
       jTextPaneStructures.getGraphics().drawImage(cpImage, 0, 0, rootPane); 
      } catch ( UnsupportedFlavorException | IOException ex) { 
       Logger.getLogger(WeeklyData.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    }  



    /* This is what TransferImage.TransferableImage refers to */ 

    public class TransferImage 
{ 
    static class TransferableImage implements Transferable 
    { 
     /* -- image for transfer */ 
     private final Image image; 

     /* -- constructor */ 

     public TransferableImage(Image image) 
     { 
     this.image = image; 
     { 
    } 
     } 
    @Override 
    public DataFlavor[] getTransferDataFlavors() 
     { 
      return new DataFlavor[] 
      { 
       DataFlavor.imageFlavor 
      }; 
     } 

    @Override 
    public boolean isDataFlavorSupported(DataFlavor flavor) 
     { 
      return flavor == DataFlavor.imageFlavor; 
     } 

    @Override 
    public Image getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { 
     if (isDataFlavorSupported(flavor)) 
     { 
      return image; 
     } 
     else 
     { 
      throw new UnsupportedFlavorException(flavor); 
     } 
     } 
    }   
+0

我先前的職位的澄清:圖像立即消失,因爲我把光標離開窗口,然後單擊別處。當我再次單擊JTextPane或JTextArea時,它們再次出現。 – Adam

回答

1

如果執行的getGraphics()的drawImage在你的聽衆,你做畫上的JTextArea的形象,但一旦系統重新繪製的JTextArea您的圖像消失,因爲它是沒有存儲在JTextArea中。

我想你應該遵循不同的方法:

  • 寫一個擴展的JTextArea(MyTextArea)一類新的
  • 包括私人財產,以存儲圖像(MYIMAGE)
  • 提供一套方法設置圖像(setImage)
  • 重寫paintComponent方法使得:
    • 它調用super.paintComponent方法
    • 然後執行graphics.drawImage(MYIMAGE,0,0,的rootPane)//好了,你可以有解決一些有關的rootPane

然後,在你的代碼:

  • jTextPaneStructures必須是新類的(MyTextArea)實例
  • 在你的聽衆(你甚至可能要提供MyTextArea一個方法執行這三個任務):
    • jTextPaneStructures.setImage(cpImage);
    • jTextPaneStructures.invaliate();
    • jTextPaneStructures.repaint();

例子:

import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JTextArea; 

public class MyTextArea extends JTextArea implements MouseListener { 

    private Image myImage; 

    public MyTextArea() { 
     addMouseListener(this); 
    } 

    public void addImage(Image image) { 
     this.myImage = image; 
     invalidate(); 
     repaint(); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(myImage, 0, 0, this); 
    } 

    public static void main(String[] args) { 
     JFrame f = new JFrame("Test"); 
     MyTextArea txt = new MyTextArea(); 
     f.getContentPane().add(txt); 
     f.getContentPane().add(new JButton("Just another component to click on"), BorderLayout.SOUTH); 
     f.pack(); 
     f.setVisible(true); 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     ImageIcon img = new ImageIcon("twitter.png"); //place a png image in your working directory for testing 
     addImage(img.getImage()); 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

} 
+0

非常感謝。我得到了它。我沒有實現MouseListener,但直接進入jTextPaneStructuresMouseClicked與jTextPaneStructures.addImage(cpImage);和 jTextPaneStructures.paintComponent(g);代替jTextPaneStructures.getGraphics()..我使用NetBeans時遇到的最大問題是因爲我必須在變量聲明中更改自動代碼。我終於通過記事本完成了它,並將更正後的代碼複製到一個新的項目文件中。代碼正常工作,但在NetBeans編輯器中我不再具有「設計」選項。你知道有沒有辦法用這個新文件得到'設計'?非常感謝。 – Adam

+0

對不起,我無法幫助你。我不太瞭解NetBeans。無論如何,我很高興你明白了。 – Dario