3

より良いタイトルがないことをお詫び申し上げますが、その性質がわからないため、エラーをさらに特定する方法がわかりません。問題が理解されれば、誰かがそれを編集できるかもしれません。

ユーザーがテキストフィールドにアイコンを追加できるアプリケーションを作成しています。私は明らかにJTextPaneテキストとアイコンを表示するためにを選びました。クラスのinsertComponent()機能を試した後、奇妙なレイアウトの問題が発生したため、oracle.comでチュートリアルを検索することにしました。例のソースコードを見た後、私は同じことを行い、スタイルを使用して基になるにコンポーネントを追加することにしましたStyledDocument。レイアウトの問題が同じままであることに気付いたのは、最初のテスト実行を開始したときでした。

では、実際に何が起こっているのでしょうか。

ここに画像の説明を入力してください

テキストペインに表示するつもりだったのは「abcOdefO」ですが、スクリーンショットからわかるように、2つのアイコン(円)の右側にスペースがあります。アイコンを少し大きい文字として扱いたいので、実際に占有しているように見える(availableSpace / numberOfIcons)ではなく、必要なだけのスペースを占有する必要があります。

キャレット位置で別の文字を入力する場合:

ここに画像の説明を入力してください

これはさらに奇妙です。アイコンにが付いている場合、MouseListeners表示されている4つの円すべてがイベントをトリガーします。フレームを別のウィンドウにドラッグするか、最小化して復元すると、奇妙な部分が消え、フレームは最初の画像のように見えます(追加の文字を除く)。だから私は、私の問題のこの部分はrepaint()正しい場所への呼び出しで修正されていると思います-しかしどこで?

これは、上記の画像を生成するコードです。

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.RenderingHints;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.StyledDocument;

public class TextPaneTestPanel extends JPanel {

    private class myIcon extends JPanel {
        private final int side;
        private final int padding = 1;

        public myIcon(int size) {
            this.side = size - 2 * padding;
            this.setSize(size, size);
            this.setPreferredSize(getSize());
            this.setMinimumSize(getSize());
        }

        public void paint(Graphics g) {
            Graphics2D g2d = (Graphics2D) g.create();

            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            g2d.setColor(Color.BLACK);
            g2d.setStroke(new BasicStroke(2));
            g2d.drawOval(padding, padding, side, side);
        }
    }

    private final JTextPane textPane;

    public TextPaneTestPanel() {

        textPane = new JTextPane();

        StyledDocument doc = textPane.getStyledDocument();
        Style def = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
        StyleConstants.setFontFamily(def, "Monospaced");

        Style regular = doc.addStyle("regular", def);

        try {
            doc.insertString(0, "abc", regular);
            Style s1 = doc.addStyle("icon1", regular);
            StyleConstants.setComponent(s1, new myIcon(20));
            doc.insertString(3, " ", s1);
            doc.insertString(4, "def", regular);
            Style s2 = doc.addStyle("icon2", regular);
            StyleConstants.setComponent(s2, new myIcon(20));
            doc.insertString(7, " ", s2);
        } catch (BadLocationException e1) {
            e1.printStackTrace();
        }

        this.setLayout(new GridBagLayout());
        this.add(textPane, new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                new Insets(4, 4, 4, 4), 0, 0));
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);

        TextPaneTestPanel panel = new TextPaneTestPanel();

        frame.getContentPane().add(panel);
        frame.setSize(300, 100);
        frame.setVisible(true);
    }

}

私の質問を要約すると:

  1. アイコンの後にスペースが表示される原因は何ですか?

  2. 画像#2に見られる問題を修正するには、repaint()またはをどこに追加しますか?revalidate()

PS:私の「アイコン」は実装されていないことは知っていますが、あらゆる種類のを処理できるIconため、必須ではありません。JTextPanesComponents

4

1 に答える 1

2

1.アイコンの後にスペースが表示される原因は何ですか?

さて、あなたは次のコードを持っています:

this.setMinimumSize(getSize());

最大サイズはどうですか?

画像#2に見られる問題を修正するにはどうすればよいですか?

カスタムペイントは、paint()メソッドではなくpaintComponent()メソッドをオーバーライドすることによって行われます。また、super.paintComponentを呼び出すことを忘れないでください。

あなたがしているのはカスタムペイントだけなので、ここではアイコンがより適切でしょう。または、JComponentでさえありますが、他のコンポーネントを保持するために使用されるコンテナーであるJPanelではありません。さらに、パネルやJComponentで発生するサイズの問題がないアイコンを使用します。これは、そのメソッドがインターフェイスの一部として具体的に実装されているためです。

于 2013-03-25T22:02:27.647 に答える