gpt4 book ai didi

java ImageObserver 停止更新动画 gif

转载 作者:搜寻专家 更新时间:2023-11-01 03:27:16 24 4
gpt4 key购买 nike

textPane 包含文本和动画 gif 图像。 imageUpdate 用于更新每个新的 gif 帧。当我从 textPane 中删除图像时,imageupdate 会继续更新它。我怎样才能阻止它?如何使 imageupdate 仅更新获得新框架而不是整个 textPane 的图像? imageupdate 始终显示 x = 0 和 y = 0,尽管图像在其他坐标中并且我无法获得特定的图像矩形。
图片001.gif http://plasmon.rghost.ru/37834058.image
图片 000.gif http://plasmon.rghost.ru/37834053.image

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.StyleSheet;
import javax.swing.*;
import java.awt.BorderLayout;
import javax.swing.text.*;

public class HighlightExample {
public static JTextPane textPane;
public static HTMLEditorKit kit = new HTMLEditorKit();
public static char c = (char)(int)10022007;
public static void main(String[] args) {
final JTextField tf = new JTextField();
JFrame f = new JFrame("Highlight example");
textPane = new JTextPane(){
@Override
public void paintComponent(Graphics g) {
Graphics2D graphics2d = (Graphics2D) g;
graphics2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
try {
Document d = (this).getDocument();
String content = d.getText(0, d.getLength()).toLowerCase();
int lastIndex = 0;
super.paintComponent(g);
Image[] image=new Image[] {Toolkit.getDefaultToolkit().getImage("000.gif"), Toolkit.getDefaultToolkit().getImage("001.gif")};
while ((lastIndex = content.indexOf(c, lastIndex)) != -1) {
g.drawImage(image[Integer.parseInt(content.substring(lastIndex+1, lastIndex+4))],(int)(this).modelToView(lastIndex).getX(),(int)(this).modelToView(lastIndex).getY(),this);
++lastIndex;
}

} catch (BadLocationException e) {}
}
public boolean imageUpdate( Image img, int flags, int x, int y, int w, int h )
{
System.out.println("Image update:" + img + " flags="+flags+" x="+x+" y="+y+" w="+w+" h="+h);
repaint(); //repaint(x, y, w, h);
return true;
}
};
tf.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
textPane.setText(tf.getText().trim());
}
});
textPane.setEditorKit(kit);
StyleSheet styleSheet = kit.getStyleSheet();
styleSheet.addRule("sm {color: red;}");
JPanel pane = new JPanel();
pane.setLayout(new BorderLayout());
pane.add(tf, "Center");
f.getContentPane().add(pane, "South");
f.getContentPane().add(new JScrollPane(textPane), "Center");
textPane.setEditable(false);
textPane.setContentType("text/html");
textPane.setText("ab<span style=\"font-size: 0px;color: white;\">"+c+"001</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;пїЅdefghijkl bпїЅlmnop12345678<span style=\"font-size: 0px;color: white;\">"+c+"000</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;)<br><br><br><br><br><br><br><br>");

f.setSize(400, 400);
f.setVisible(true);
}
}

最佳答案

  1. 只加载一次图像,而不是每次重绘时加载图像
  2. 对于每张图片,都有一个列表,你在上次paint
  3. 中绘制它的位置
  4. imageUpdate 中使用给定的 img 选择您在 paintComponent 中为该图像填充的坐标列表,并且仅为该图像重绘区域坐标

注意:您的文本中当前未使用的图像仍会调用 imageUpdate 但会自动跳过,因为它们的坐标列表应该为空

关于java ImageObserver 停止更新动画 gif,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10375686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com