首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中,图像不停留在JTextPane中

在Java中,图像不停留在JTextPane中
EN

Stack Overflow用户
提问于 2014-03-19 16:56:12
回答 1查看 234关注 0票数 0

我一直在尝试将图片(图纸)从剪贴板传送到JTextPane或JTextArea。附加的代码正确地显示了这些窗口中的图像,但是一旦我将光标从窗口中移开,图像就会消失。我如何修复JText中的图像.?我的代码中显然缺少了一些东西。我的网络搜索没有产生任何有用的东西。我对C#没有这个问题。我非常感谢你的帮助。

代码语言:javascript
复制
    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 );
        }
      }
   }          
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-19 17:37:55

如果在侦听器中执行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();

示例:

代码语言:javascript
复制
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

   }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22512906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档