【发布时间】:2018-09-16 15:27:04
【问题描述】:
我认为用 java 创建一个小程序会很容易:
- 我创建了一个 jFrame =>(大小为 500,500 并且可见)
- 我在 jFrame 中添加了一个 mouseListener
- 当我点击时,我想在这个位置创建一个椭圆
所以我做了什么:
- 我创建了一个班级圈子(JPanel)
- 每当mouslistener 注意到我点击了jFrame 时,我都会在其中添加一个新圆圈。 (它获取 x 和 y 点作为参数)
然后令人震惊的事情发生了: 我点击了我的 jFrame ......什么也没发生。 我想:好吧,让我们在创建新圈子后重新绘制......但它什么也没发生! 只有当我点击windwos边框并重新拉伸它时,它才会“重新绘制”它。
同时,真正糟糕和可悲的是,如果我单击一个位置,然后单击另一个位置,然后重新拉伸框架,它只会绘制最后一个圆圈:(它应该同时绘制两个!)
现在我将 repaint() 放在数千个不同的地方,但没有区别。我还尝试了 setopaque 等,只是因为我现在不知道该怎么做!
这里是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);
}
}
【问题讨论】:
-
阅读 Custom Painting 上的 Swing 教程部分,了解如何进行自定义绘画的分步示例。
标签: java swing mouselistener