ホームページ  >  記事  >  Java  >  各セルの JButton に依存せずに、特に大規模なグリッドの場合に、グリッド ベースのピクセル エディタを Java で効率的に実装するにはどうすればよいでしょうか?

各セルの JButton に依存せずに、特に大規模なグリッドの場合に、グリッド ベースのピクセル エディタを Java で効率的に実装するにはどうすればよいでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-26 22:37:31425ブラウズ

How can I efficiently implement a grid-based pixel editor in Java, especially for large grids, without relying on JButtons for each cell?

Java でのグリッドベースのピクセル エディターの実装

编程プログラミングの熟練度を高めるために、開発者はピクセル エディターなどの基本的なアプリケーションの作成に着手することがよくあります。ピクセル エディタのコア機能には、一般的なイメージ エディタと同様に、ユーザーが色を選択し、キャンバス上のグリッド セルを変更することが含まれます。

頻繁に生じる質問の 1 つは、このようなグリッドベースのオブジェクトを実装するための Java コンポーネントの最適な選択です。システム。 JButton を個々のセルとして使用するのは直感的に見えるかもしれませんが、特に大きなグリッドの場合、非効率的で非実用的になる可能性があります。

幸いなことに、より効率的なアプローチが存在します。開発者は、drawImage() メソッドを利用し、マウス座標をスケーリングすることで、かなりのサイズのピクセルを作成できます。

この手法を実証するために、次の例を考えてみましょう。

Grid.java

<code class="java">// Import required Java library
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;

/**
 * This class extends JPanel to create a grid-based pixel editor.
 * @see <a href="https://stackoverflow.com/questions/2900801">Original question</a>
 */
public class Grid extends JPanel implements MouseMotionListener {

    // Create buffered image for drawing
    private final BufferedImage img;
    // Image and panel dimensions
    private int imgW, imgH, paneW, paneH;

    public Grid(String name) {
        // Initialize basic attributes
        super(true);
        // Get the image icon and its dimensions
        Icon icon = UIManager.getIcon(name);
        imgW = icon.getIconWidth();
        imgH = icon.getIconHeight();
        // Set preferred size for the panel
        this.setPreferredSize(new Dimension(imgW * 10, imgH * 10));
        // Create a BufferedImage for the image
        img = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB);

        // Get Graphics2D object for drawing
        Graphics2D g2d = (Graphics2D) img.getGraphics();
        // Draw the image icon on the BufferedImage
        icon.paintIcon(null, g2d, 0, 0);
        // Dispose the Graphics2D object
        g2d.dispose();

        // Add MouseMotionListener to the panel
        this.addMouseMotionListener(this);
    }

    @Override
    protected void paintComponent(Graphics g) {
        // Get current panel dimensions
        paneW = this.getWidth();
        paneH = this.getHeight();
        // Draw the image on the panel with scaling
        g.drawImage(img, 0, 0, paneW, paneH, null);
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        // Calculate mouse coordinates scaled to image size
        Point p = e.getPoint();
        int x = p.x * imgW / paneW;
        int y = p.y * imgH / paneH;
        // Get the pixel color at the calculated scaled coordinates
        int c = img.getRGB(x, y);
        // Set tooltip text with color information
        this.setToolTipText(x + "," + y + ": "
            + String.format("%08X", c));
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        // Mouse drag functionality is not implemented in this example
    }

    // Helper method to create the GUI
    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new Grid("Tree.closedIcon"));
        f.pack();
        f.setVisible(true);
    }

    // Main method to run the application
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                create();
            }
        });
    }
}</code>

この技術を利用することで、開発者は大規模でスケーラブルなグリッドを備えたピクセル エディタを簡単に作成でき、効率を維持しながらユーザー エクスペリエンスを向上させることができます。

以上が各セルの JButton に依存せずに、特に大規模なグリッドの場合に、グリッド ベースのピクセル エディタを Java で効率的に実装するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。