0

VisioまたはUMLクラス図エディターを使用したことがある場合は、私が何を達成しようとしているのかがわかります。JFrame内で、ユーザーは編集可能な小さなテキストフィールドを囲む省略記号を追加できます。これらの楕円は、ユーザーがドラッグしたときにフレーム内で再配置できます。楕円をクリックすると、テキストが編集可能になります。カラットが表示されたり、部分文字列を強調表示したりできます。

基本的な構造を設定しました。「ellipse」は自己完結型のコンポーネントであり、含まれているJFrameとそのリスナーからメソッドが呼び出されます。私は2つのアプローチを試しました:

  1. コンポーネントのdraw()メソッドで、TextLayoutを使用して境界を見つけ、含まれているテキストを楕円内に配置し、TextLayoutのdraw()を使用してフレームに描画します。これは速いです。JFrame内でコンポーネントをドラッグすると、マウスオーバーとマウスクリックの動作はすべて簡単です。ただし、編集機能については、ヒットテスト、カラットポジショニング、テキストの強調表示、行の折り返しなどを処理するために、多くのカスタムコードを作成する必要があるようです。

  2. コンポーネントに含まれているJFrameへの参照を含め、楕円を描画した後、そのJFrameにTextComponentを追加または再配置します。これには、編集および行の折り返しのためのすべての組み込みTextComponent動作の利点があります。しかし、ロジスティクスは非常に雑然としており、TextComponentの配置も面倒になります。特に、ユーザーがコンポーネントをドラッグした場合はなおさらです。

私はおそらくこれをすべて間違っていると考えています。私がまだ遭遇していない、これを行う簡単な方法を誰かが提案できますか?

4

1 に答える 1

0

両方のアプローチを組み合わせてみませんか。編集している限り、テキストコンポーネントを表示します。それ以外の場合は、を使用してすべてのテキストをペイントしますTextLayout。次のサンプルコードは、単純なを拡張するそのようなアプローチを示していますJComponent。テキストを含む長方形を描画し、内部をクリックすると編集の可能性が表示されます。もう一度外側をクリックするとすぐに、コンポーネントが消えました。この基本的な例では、すべての編集処理機能が欠落していることに注意してください。

class TestComponent extends JComponent {
    JTextArea jta = new JTextArea("12345");

    public TestComponent() {
        setPreferredSize(new Dimension(400, 400));
        setLayout(null);
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(final MouseEvent e) {
                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        if (e.getX() >= 40 && e.getX() <= 200 && e.getY() >= 40 && e.getY() <= 80) {
                            TestComponent.this.add(jta);
                            jta.setBounds(42, 42, 156, 36);
                        } else {
                            TestComponent.this.remove(jta);
                        }
                        repaint();
                    }
                });
            }
        });
    }

    @Override
    public void paintComponent(Graphics _g) {
        Graphics2D g = (Graphics2D) _g;
        g.drawRect(40, 40, 160, 40);
        TextLayout layout = new TextLayout("12345", g.getFont(), g.getFontRenderContext());
        layout.draw(g, 42, 42 + layout.getAscent());
    }
}
于 2011-06-16T17:23:53.893 に答える