【问题标题】:Image does not stay in JTextPane in Java图像不会留在 Java 中的 JTextPane 中
【发布时间】:2014-03-19 16:56:12
【问题描述】:

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

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

【问题讨论】:

  • 澄清我之前的帖子:只要我将光标从窗口上移开并单击其他位置,图像就会消失。当我再次单击 JTextPane 或 JTextArea 时,它们会再次出现。

标签: java swing clipboard jtextpane drag-and-drop


【解决方案1】:

如果您在侦听器中执行 getGraphics().drawImage,您确实会在 JTextArea 上绘制图像,但是一旦系统重新绘制 JTextArea,您的图像就会消失,因为它没有存储在 JTextArea 中。

我认为你应该采用不同的方法:

  • 编写一个扩展 JTextArea (MyTextArea) 的新类
  • 包含一个私有属性来存储图像 (myImage)
  • 提供set方法来设置图片(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

   }

}

【讨论】:

  • 非常感谢。我明白了。我没有实现 MouseListener,而是直接使用 jTextPaneStructures.addImage(cpImage); 进入 jTextPaneStructuresMouseClicked;和 jTextPaneStructures.paintComponent(g);代替 jTextPaneStructures.getGraphics().. 我在使用 NetBeans 时遇到的最大问题是因为我必须更改变量声明中的自动代码。我终于通过记事本完成了,并将更正的代码复制到一个新的项目文件中。该代码有效,但我在 NetBeans 编辑器中不再有“设计”选项。你知道有没有办法用这个新文件找回“设计”?再次感谢。
  • 很抱歉,我无法为您提供帮助。我不太了解 NetBeans。无论如何,我很高兴你得到它。
猜你喜欢
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多