より良いタイトルがないことをお詫び申し上げますが、その性質がわからないため、エラーをさらに特定する方法がわかりません。問題が理解されれば、誰かがそれを編集できるかもしれません。
ユーザーがテキストフィールドにアイコンを追加できるアプリケーションを作成しています。私は明らかに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);
}
}
私の質問を要約すると:
アイコンの後にスペースが表示される原因は何ですか?
画像#2に見られる問題を修正するには、
repaint()
またはをどこに追加しますか?revalidate()
PS:私の「アイコン」は実装されていないことは知っていますが、あらゆる種類のを処理できるIcon
ため、必須ではありません。JTextPanes
Components