首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单击Java Swing创建Oval

单击Java Swing创建Oval
EN

Stack Overflow用户
提问于 2018-09-16 15:27:04
回答 2查看 305关注 0票数 0

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

  • 我创建了一个jFrame => (大小为500,500并且是可见的)
  • 我将mouseListener添加到jFrame中
  • 当我单击时,我想在这个位置创建一个椭圆形。

所以我所做的是:

  • 我创建了一个类循环( JPanel)
  • 每当mouslistener注意到我单击了jFrame时,我就给它添加一个新的循环。(它以x和y点作为参数)

然后发生了一些令人震惊的事情:我点击了我的jFrame.什么都没发生。我想:好吧,我们在创建新的圆圈之后再画一遍.但什么都没发生!只有当我点击风车边框并重新调整它时,它才会“重新绘制”它。

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

现在我在上千个不同的地方重新油漆,但没有区别。我也尝试了一些与赛普亚克等,只是因为我不知道做什么,在这一点上!

这里mouseListener:您可以忽略颜色

代码语言:javascript
复制
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);

            }
        });
    }

}

和现在的圆圈:

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2018-09-16 15:42:10

JFrame的默认布局是BorderLayout。当在没有指定位置的情况下将组件添加到BorderLayout中时,它们将被添加到BorderLayout.CENTER中,取代以前设置到此位置的组件。这意味着始终只有一个Circle添加到JFrame中。

在任何情况下,看起来您都试图在光标的位置画圆圈,这意味着您必须在不同的位置将Circle组件添加到JFrame中,这并不容易。相反,最好只向框架中添加一个组件,并绘制该组件中的所有圆圈。

票数 1
EN

Stack Overflow用户

发布于 2018-09-16 16:16:51

如果将组件添加到mouseClicked事件中,可能会重新验证应该调用的组件,因为您更改了容器( JFrame)。另外,JFrame也是特殊的:它们有一个内容窗格,您应该以这种方式添加组件:

代码语言:javascript
复制
frame.getContentPane().add(...);

默认内容窗格使用BorderLayout

为每次单击添加一个组件可能会导致过度,除非您将布局设置为null (例如:绝对布局)并为每个圆圈调用setBounds(x、y、50、50)。

但是,由于您重写了paintComponent,所以您可以直接绘制椭圆,而不关心布局或组件。

添加一次带有Circle约束的BorderLayout.CENTER组件。这将确保您的Circle将得到最大的大小,它可以。

MouseListener应该在圆圈上,您必须使其可调(setFocus(true))。

每次在Circle上单击鼠标时,请在列表中注册鼠标位置(例如:List<Point>),然后调用repaint:

代码语言:javascript
复制
circle.points.add(new Point(e.getX(), e.getY()); // 
circle.repaint();

每次调用paintComponent(Graphics)时,都使用列表按照调用的顺序绘制椭圆。

代码语言:javascript
复制
@Override
protected void paintComponent(Graphics g) {
    System.out.println("paint");
    Graphics2D g2d = (Graphics2D) g;
    super.paintComponent(g2d);
    g2d.setColor(decodeCircleColor(circleColor));
    // if you know lambda
    points.forEach(p -> g2d.fillOval(p.x, p.y, 50, 50)); 
    // or if you don't know lambda yet.
    // for (Point p : points) g2d.fillOval(p.x, p.y, 50, 50)); 
}

注意,您可以使用Point或任何相关的类(例如,您可以使用一个具体的对象来存储Paint对象,比如java.awt.Color,以更改椭圆的颜色)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52355606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档