我认为用 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/