Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在每次执行侦听器时更改面板的图形?_Java_Swing_Graphics_Listener_Panel - Fatal编程技术网

Java 如何在每次执行侦听器时更改面板的图形?

Java 如何在每次执行侦听器时更改面板的图形?,java,swing,graphics,listener,panel,Java,Swing,Graphics,Listener,Panel,我正在试着改变鼠标按下后我所做的点的颜色。因此,理想情况下,您可以在程序运行时连续随机绘制彩色点。我似乎无法理解这一点,因为如果我尝试在侦听器中引用图形页面,它将无法识别。如果我把随机颜色线放在图形构造器中,那么程序将以一种随机颜色运行,并且不会对每个点进行更改 import java.util.ArrayList; import java.util.Random; import javax.swing.JPanel; import java.awt.*; import java.awt.eve

我正在试着改变鼠标按下后我所做的点的颜色。因此,理想情况下,您可以在程序运行时连续随机绘制彩色点。我似乎无法理解这一点,因为如果我尝试在侦听器中引用图形页面,它将无法识别。如果我把随机颜色线放在图形构造器中,那么程序将以一种随机颜色运行,并且不会对每个点进行更改

import java.util.ArrayList;
import java.util.Random;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;

public class DotsPanel extends JPanel {
    private final int SIZE = 6; // radius of each dot
    Random rand = new Random();
    private ArrayList<Point> pointList;
    Color randomColor = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));

    public DotsPanel() {
        pointList = new ArrayList<Point>();

        addMouseListener(new DotsListener());
        addMouseMotionListener(new DotsListener());

        setBackground(Color.black);
        setPreferredSize(new Dimension(300, 200));
    }

    public void paintComponent(Graphics page) {
        super.paintComponent(page);
        for (Point spot : pointList) {
            page.setColor(randomColor);
            page.fillOval(spot.x - SIZE, spot.y - SIZE, SIZE * 2, SIZE * 2);
        }
        page.drawString("Count: " + pointList.size(), 5, 15);
    }

    private class DotsListener implements MouseListener, MouseMotionListener {
        public void mousePressed(MouseEvent event) {
            pointList.add(event.getPoint());
            repaint();
        }

        public void mouseDragged(MouseEvent event) {
            pointList.add(event.getPoint());
            repaint();
        }

        public void mouseClicked(MouseEvent event) {
        }

        public void mouseReleased(MouseEvent event) {
        }

        public void mouseEntered(MouseEvent event) {
        }

        public void mouseExited(MouseEvent event) {
        }

        public void mouseMoved(MouseEvent e) {
        }
    }
}

首先,您需要将点与颜色相关联,这可以通过以下两种方式之一实现:

通过在BuffereImage上绘制点,并在JPanel的组件绘制方法paintComponent中绘制该图像,或 通过某种方式直接将颜色与点关联(例如与地图或将二者结合在一起的自定义对象关联),在paintComponent方法中绘制所有点及其关联的颜色。 在你的听众中,创建你的圆点和它的颜色,并使用你想要的任何技术将它们关联起来

例如,使用一个HashMap将一个形状关联到一个包含圆和颜色的椭圆2D,称为shapeColorMap


我不太明白。我无法从侦听器中引用paintComponent方法中的任何内容。如果我在侦听器中创建点,如何将它们与图形关联?@TurnerWheat:将要绘制的对象放在某个集合中,例如ArrayList或此处的HashMap,然后在paintComponent方法中,迭代此集合,绘制每个项。参见上面的示例
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.*;

@SuppressWarnings("serial")
public class RandomDot extends JPanel {
    // size of JPanel
    private static final int PREF_W = 800;
    private static final int PREF_H = 650;
    // width of dot
    public static final int DOT_WIDTH = 40;
    private Map<Shape, Color> shapeColorMap = new HashMap<>();

    public RandomDot() {
        setPreferredSize(new Dimension(PREF_W, PREF_H));
        addMouseListener(new MyMouse());
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        // smooth out jaggies in graphics
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        // iterate through the Map getting color and circle
        for (Entry<Shape, Color> entry : shapeColorMap.entrySet()) {
            Color color = entry.getValue();
            Shape shape = entry.getKey();
            g2.setColor(color);
            g2.fill(shape);
        }
    }

    private class MyMouse extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            // get a random color using HSB
            float multiplier = 0.3f;
            float hue = (float)Math.random();
            float saturation = (float) (multiplier * Math.random() + (1 - multiplier));
            float brightness = (float) (multiplier * Math.random() + (1 - multiplier));
            Color color = Color.getHSBColor(hue, saturation, brightness);

            // create a circle at mouse click
            double x = e.getX() - DOT_WIDTH / 2;
            double y = e.getY() - DOT_WIDTH / 2;
            double w = DOT_WIDTH;
            Ellipse2D circle = new Ellipse2D.Double(x, y, w, w);

            // put both into the map
            shapeColorMap.put(circle, color);

            // repaint
            repaint();
        }
    }

    private static void createAndShowGui() {
        RandomDot mainPanel = new RandomDot();

        JFrame frame = new JFrame("RandomDot");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}