4

textPane には、テキストとアニメーション gif 画像が含まれています。imageUpdate は、新しい gif フレームを更新するために使用されます。textPane から画像を削除すると、imageupdate は画像を更新し続けます。どうすればそれを止めることができますか? textPane全体ではなく、新しいフレームを取得した画像のみをimageupdateで更新するにはどうすればよいですか? 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);
    }
}
4

1 に答える 1

2
  1. 再描画するたびにではなく、一度だけ画像をロードする
  2. 各画像について、最後に描いた場所のリストを保持しますpaint
  3. 指定されたをimageUpdate使用して、その画像にimg入力した座標のリストを選択し、paintComponentその座標の領域のみを再描画します

注:テキストで現在使用されていない画像は引き続き呼び出されますimageUpdateが、座標のリストが空であるため、自動的にスキップされます

于 2012-05-18T13:01:53.853 に答える