[英]Change the color of an oval at click in Java AWT
我必須在Java中繪制一些橢圓,然后單擊以更改其顏色。 首先,我嘗試在20毫秒后更改顏色,但是它不起作用。
我的代碼是:
public class MyComponentNew extends Frame {
public Graphics2D g2d;
public MyComponentNew(String title) {
super(title);
setSize(400, 550);
}
@Override
public void paint(Graphics g) {
this.g2d = (Graphics2D) g;
this.g2d.setColor(Color.red);
this.g2d.fillOval(10, 55, 50, 100);
}
public void changeColor () {
this.g2d.setColor(Color.blue);
this.g2d.fillOval(10, 55, 50, 100);
}
}
在具有main方法的類中,我有:
MyComponentNew m;
m = new MyComponentNew("Fereastra cu baloane");
m.setVisible(true);
m.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
System.exit(0);
}
});
try {
Thread.sleep(20);
} catch(InterruptedException e) {}
m.changeColor();
橢圓形的顏色保持紅色。
您需要查看“ 執行自定義繪畫” 。 您有點概念,但是您的changeColor
方法不會為您做任何事情。
一些注意事項。
首先,您需要添加一個MouseListener
。 在如何編寫MouseListeners中查看更多信息
其次,您要做的只是擁有一個Color color
變量。 您可以使用該變量設置顏色。 您的方法changeColor
應該只更改顏色和repaint()
。 就像是
public class MyComponentNew extends JPanel { private Color color = Color.BLUE; protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(color); } public void changeColor() { if (color == Color.BLUE) { color = Color.RED: } else { color = color.BLUE; } repaint(); } }
第三個注意事項是我如何使用JPanel
而不是JFrame
。 這是首選方法。
第四,您應該使用Swing而不是AWT。
這是一個完整的示例,上面有幾點
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class CircleChangeColor extends JPanel {
private Ellipse2D circle = new Ellipse2D.Double(0, 0, 200, 200);
private Color color = Color.blue;
public CircleChangeColor() {
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e) {
if (circle.contains(e.getPoint())) {
changeColor();
}
}
});
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setColor(color);
g2.fill(circle);
}
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
public void changeColor() {
if (color == Color.BLUE) {
color = Color.RED;
} else {
color = color.BLUE;
}
repaint();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
JFrame frame = new JFrame();
frame.add(new CircleChangeColor());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
}
原因是AWT會定期調用您的paint
方法,它會快速繪制新的藍色橢圓和原始的紅色橢圓。 通過將橢圓形顏色存儲在成員變量中,在paint
方法中讀取它,然后在changeColor
方法中對其進行更改,可以獲得所需的行為。
public class MyComponentNew extends Frame {
private Color ovalColor;
public MyComponentNew(String title) {
super(title);
setSize(400, 550);
ovalColor = Color.red; // initial oval color
}
@Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
g2d.setColor(ovalColor); // use whatever the current color is
g2d.fillOval(10, 55, 50, 100);
}
public void changeColor() {
ovalColor = Color.blue; // change color
repaint(); // force redraw with new color
}
}
您需要在JFrame上調用repaint()方法,但是正如代碼所示,由於將調用繪畫方法,因此將再次繪制紅色橢圓形。 您需要像這樣更改它:
import java.awt.Graphics2D;
public class MyComponentNew extends Frame{
public Graphics2D g2d;
public Color color = Color.red;
public MyComponentNew(String title) {
super(title);
setSize(400, 550);
}
@Override
public void paint(Graphics g) {
this.g2d = (Graphics2D) g;
this.g2d.setColor(color);
this.g2d.fillOval(10, 55, 50, 100);
//this.g2d.drawLine (WIDTH, WIDTH, WIDTH, WIDTH);
}
public void changeColor (){
color = Color.blue;
this.repaint();
}
}
現在,顏色是在changeColor方法期間設置的實例變量。
/缺口
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.