-3

コンテンツのバッキング イメージを保持する独自のカスタム コントロールがあります。このバッファのタイプはBufferedImageです。

注意!バッキング イメージの使用は要件によるものです。内に描くことを教えないでpaintComponent()

現在、次の方法で画像のサイズを変更しています。

@Override
public void setBounds(int x, int y, int width, int height) {

    if( bufferedImage == null ) {
        bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    }
    else {
        if( bufferedImage.getWidth() < width || bufferedImage.getHeight() < height ) {
            BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
            newImage.createGraphics().drawImage(bufferedImage, 0, 0, null);
            bufferedImage = newImage;
        }
    }
    super.setBounds(x, y, width, height);
}

残念ながら、これには新しいBufferedImageオブジェクトを作成する必要があるため、以前に取得したGraphicsオブジェクトが無効になります。

だから私は私自身の方法を持たなければならない

public Graphics2D createImageGraphics() {
    if( bufferedImage != null ) {
        return bufferedImage.createGraphics();
    }
    else {
        return null;
    }
}

オーバーライドしたいのですがgetGraphics()

Graphics オブジェクトを節約するために画像のサイズを変更することは可能ですか?

4

1 に答える 1

-1

Swing でカスタム ペインティングを実行する方法の小さな例を次に示します。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class JFrameTest {

    private boolean drawOval = false;

    protected void initUI() {
        final JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (drawOval) {
                    g.setColor(Color.BLUE);
                    g.drawOval(0, 0, 100, 100);
                }
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(100, 100);
            }
        };

        AbstractAction drawAction = new AbstractAction("Draw") {

            @Override
            public void actionPerformed(ActionEvent e) {
                drawOval = true;
                panel.repaint();
            }
        };

        JButton drawButton = new JButton(drawAction);

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(drawButton);

        JFrame frame = new JFrame();
        frame.add(panel, BorderLayout.CENTER);
        frame.add(buttonPanel, BorderLayout.SOUTH);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();

        frame.setVisible(true);

    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JFrameTest().initUI();
            }
        });

    }
}
于 2013-02-20T15:28:56.027 に答える