3

グラフィックス コンテキストを適切に破棄する方法 - と を使用する必要がtryありfinallyますか? 簡単な例:

public void paint(Graphics g) {

    Graphics2D g2d = (Graphics2D) g.create();

    try {

        g2D.drawLine(0, 0, 10, 0);

    } finally {
        g2d.dispose();
    }
}

編集

これは、java.awt.Window クラスの例です。

     /**
     * {@inheritDoc}
     *
     * @since 1.7
     */
    @Override
    public void paint(Graphics g) {
        if (!isOpaque()) {
            Graphics gg = g.create();
            try {
                if (gg instanceof Graphics2D) {
                    gg.setColor(getBackground());
                    ((Graphics2D)gg).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC));
                    gg.fillRect(0, 0, getWidth(), getHeight());
                }
            } finally {
                gg.dispose();
            }
        }
        super.paint(g);
    }

ご覧のとおり、使用されるコンストラクターは非常に単純ですがtryfinallyそれでも終了します。したがって、それらを使用することは良い習慣になると思います。

4

1 に答える 1

5

try..finallyこの単純な例では、 ;は必要ありません。g2D.drawLine例外をスローしません。1ただし、の本体がtry例外をスローしたり、returnステートメントを実行したり、メソッドを異常終了させたりする可能性がある場合は、コンテキストが適切に破棄されるようにすることをpaintお勧めします。try..finally

1 またはその他のチェックされていない例外をスローする可能性があると思います。OutOfMemoryErrorただし、そうする場合、Graphics2Dコンテキストを破棄することは問題が最も少なくなります。

于 2013-08-12T19:01:50.500 に答える