0

マウスをクリックするたびに白い背景にラウンドを描画するこのコードを書きました。背景に画像を追加した唯一の問題であり、マウスのクリック時にラウンドを追加したいのですが、そうしません。これは以下のコードです。助けてください

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Frame {

    JFrame frame;
    MyPanel p;
    Timer t;
    Icon icon;

    //contructor
    public Frame() {
        frame = new JFrame("Painting");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initComponents();
        frame.add(p);
        frame.pack();
        frame.setVisible(true);
        t.start();

    }

    private void initComponents() {

        final ActionListener action = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent evt) {

                p.repaint();
            }
        };
        t = new Timer(50, action);
        p = new MyPanel();

        p.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                p.addEntity(e.getX(), e.getY(), 10, 10, Color.BLACK);
                System.out.println("clicked");
            }
        });

        icon = new ImageIcon("flower.gif");
        JLabel label = new JLabel(icon);
        JScrollPane scrollPane = new JScrollPane(label);
        p.add(scrollPane, BorderLayout.WEST);

        p.setBackground(Color.WHITE);
    }
}

class MyPanel extends JPanel {

    int width = 300, height = 300;
    ArrayList<MyCircle> entities = new ArrayList<MyCircle>();

    void addEntity(int x, int y, int w, int h, Color c) {
        entities.add(new MyCircle(x, y, w, h, c));
    }

    @Override
    protected void paintComponent(Graphics grphcs) {
        super.paintComponent(grphcs);
        Graphics2D g2d = (Graphics2D) grphcs;

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        for (MyCircle entity : entities) {
            g2d.setColor(entity.getColor());
            g2d.fillOval((int) entity.x, (int) entity.y, (int) entity.width, (int) entity.height);
        }
    }

    //frame dimesion
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(width, height);
    }
}

//create the circle
class MyCircle extends Rectangle2D.Double {

    Color color;

    public MyCircle(double x, double y, double w, double h, Color c) {
        super(x, y, w, h);
        color = c;

    }

    public void setColor(Color color) {
        this.color = color;
    }

    public Color getColor() {
        return color;
    }
}
4

1 に答える 1

0

MouseListener質問で使用されている は に登録されていませんJLabel。JLabel のカスタム ペイント ロジックを複製しようとする代わりに、Image起動時に を読み込んで既存のカスタム ペイント ロジックに含めることができます。

例えば

public MyPanel(Image image) {
   this.image = image;
}

@Override
protected void paintComponent(Graphics grphcs) {
   super.paintComponent(grphcs);
   grphcs.drawImage(image, 0, 0, this);
   ...
}
于 2013-07-12T16:58:00.433 に答える