我认为用java创建一个小程序很容易:
所以我所做的是:
然后发生了一些令人震惊的事情:我点击了我的jFrame.什么都没发生。我想:好吧,我们在创建新的圆圈之后再画一遍.但什么都没发生!只有当我点击风车边框并重新调整它时,它才会“重新绘制”它。
同时,真正糟糕和悲哀的是,如果我在一个位置单击,然后在另一个位置单击,然后重新绘制框架,它只画最后一个圆圈:(两者都应该画!)
现在我在上千个不同的地方重新油漆,但没有区别。我也尝试了一些与赛普亚克等,只是因为我不知道做什么,在这一点上!
这里mouseListener:您可以忽略颜色
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);
}
}发布于 2018-09-16 15:42:10
JFrame的默认布局是BorderLayout。当在没有指定位置的情况下将组件添加到BorderLayout中时,它们将被添加到BorderLayout.CENTER中,取代以前设置到此位置的组件。这意味着始终只有一个Circle添加到JFrame中。
在任何情况下,看起来您都试图在光标的位置画圆圈,这意味着您必须在不同的位置将Circle组件添加到JFrame中,这并不容易。相反,最好只向框架中添加一个组件,并绘制该组件中的所有圆圈。
发布于 2018-09-16 16:16:51
如果将组件添加到mouseClicked事件中,可能会重新验证应该调用的组件,因为您更改了容器( JFrame)。另外,JFrame也是特殊的:它们有一个内容窗格,您应该以这种方式添加组件:
frame.getContentPane().add(...);默认内容窗格使用BorderLayout。
为每次单击添加一个组件可能会导致过度,除非您将布局设置为null (例如:绝对布局)并为每个圆圈调用setBounds(x、y、50、50)。
但是,由于您重写了paintComponent,所以您可以直接绘制椭圆,而不关心布局或组件。
添加一次带有Circle约束的BorderLayout.CENTER组件。这将确保您的Circle将得到最大的大小,它可以。
MouseListener应该在圆圈上,您必须使其可调(setFocus(true))。
每次在Circle上单击鼠标时,请在列表中注册鼠标位置(例如:List<Point>),然后调用repaint:
circle.points.add(new Point(e.getX(), e.getY()); //
circle.repaint();每次调用paintComponent(Graphics)时,都使用列表按照调用的顺序绘制椭圆。
@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,以更改椭圆的颜色)。
https://stackoverflow.com/questions/52355606
复制相似问题