Java Swing 通过单击创建椭圆形

标签 java swing mouselistener

我认为用 java 创建一个小程序会很容易:

  • 我创建一个 jFrame =>(大小 500,500 并且可见)
  • 我向 jFrame 添加了一个 mouseListener
  • 当我点击时,我想在这个位置创建一个椭圆形

所以我做了什么:

  • 我创建了一个类(class)圈子 (JPanel)
  • 每次 mouslistener 注意到我单击了 jFrame,我都会向其添加一个新圆圈。 (它获取 x 和 y 点作为参数)

然后令人震惊的事情发生了: 我点击进入我的 jFrame...什么也没发生。 我想:好吧,让我们在创建新圆圈后重新绘制......但什么也没发生! 仅当我单击windwos边框并重新拉伸(stretch)它时,它才会“重新绘制”它。

同时,真正糟糕和悲伤的是,如果我单击一个位置,然后单击另一个位置,然后重新拉伸(stretch)框架,它只会绘制最后一个圆圈:(它应该绘制两个!)

现在我把 repaint() 放在数千个不同的地方,但没有区别。我也尝试过使用 setopaque 等,只是因为我此时不知道该怎么做!

这里是鼠标监听器:你可以忽略颜色

public class Aufgabe3 {
    public static Circ.CircleColor actualColor = CircleColor.ROT;

    // fromone color to another depend on the actual
    public static Circ.CircleColor getNextColor(Circ.CircleColor aktuell) {
        switch (aktuell) {
        case ROT:
            return Circ.CircleColor.GRÜN;
        case GRÜN:
            return Circ.CircleColor.GELB;
        case GELB:
            return Circ.CircleColor.ROT;
        default:
            return null;
        }

    }

    public static void main(String[] args) {

        JFrame jFrame = new JFrame();
        jFrame.setVisible(true);
        jFrame.setSize(500, 500);
        jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
        // jFrame.add()
        // farbenfolge rot,grün,gelb--
        jFrame.addMouseListener(new MouseListener() {

            @Override
            public void mouseReleased(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mousePressed(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("clicked");
                int x = e.getX();
                int y = e.getY();
                System.out.println("coords:" + x + "|" + y);
                Circ circ = new Circ(x, y, actualColor);
                circ.repaint();
                jFrame.add(circ);
                jFrame.repaint();
                System.out.println(actualColor);
                // actualisation of the next color
                actualColor = getNextColor(actualColor);

            }
        });
    }

}

现在是圆圈:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JComponent;
import javax.swing.JPanel;

public class Circ extends JComponent {
    static public enum CircleColor {
        ROT, GRÜN, GELB
    };

    private int x;
    private int y;
    private CircleColor circleColor;

    public Circ() {
        super();

    }

    public Circ(int x, int y, CircleColor circColor) {
        super();
        this.x = x;
        this.y = y;
        this.circleColor = circColor;
        System.out.println("new circle created");
        setSize(new Dimension(50, 50));
        setVisible(true);
        setOpaque(true);
    }

    public Color decodeCircleColor(CircleColor farbe) {
        switch (farbe) {
        case GRÜN:
            return Color.GREEN;
        case GELB:
            return Color.yellow;
        case ROT:
            return Color.red;
        default:
            return null;
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        System.out.println("paint");
        Graphics2D g2d = (Graphics2D) g;
        super.paintComponent(g2d);
        g2d.setColor(decodeCircleColor(circleColor));
        // g2d.drawOval(x, y, 50, 50);
        g2d.fillOval(x, y, 50, 50);
    }
}

最佳答案

JFrame 的默认布局是 BorderLayout。 将组件添加到 BorderLayout 而不指定位置时,它们会添加到 BorderLayout.CENTER 中,替换设置到该位置的前一个组件。 这意味着您始终只有一个 Circle 添加到您的 JFrame 中。

无论如何,您似乎正在尝试在光标位置绘制圆圈,这意味着您必须将 Circle 组件添加到 JFrame在不同的位置,这并不容易。 相反,您最好只向框架添加一个组件并在该组件中绘制所有圆圈。

关于Java Swing 通过单击创建椭圆形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52355606/

相关文章:

java - 无法弄清楚我的数组列表的输出

java - GetComponentAt Trouble 问题

java - 实时监听JFrame高宽

java - 如何在 Swing 中将选择限制为最多三个单选按钮中的两个?

java - 使用 acm.graphics 时 mouseListener 的语法是什么

java - 我该如何解决这个错误? (错误: Gradle DSL method not found: 'implementation()' )

java - Jackson - 使用 Jackson 的反序列化器反序列化单个值

java - 通知抽屉似乎已满 - 新通知被丢弃

java - JTextArea 中的控制台输出和用户输入

java - 修复Java虚拟机热点错误的解决方案?