Java图形,使用单击事件更改图形的颜色
好的,基本上我正在尝试编写一个GUI应用程序,它在主窗口中绘制两个圆圈和两个矩形。我试图得到它,这样每当用户在圆圈或矩形内单击时,特定的圆圈或矩形就会变成另一种随机颜色 目前,我已经得到了它,所以鼠标点击事件在屏幕上的任何地方都会导致所有的圆圈或矩形改变颜色,变成相同的颜色。 到目前为止,我得到的是:Java图形,使用单击事件更改图形的颜色,java,swing,graphics,colors,mouseclick-event,Java,Swing,Graphics,Colors,Mouseclick Event,好的,基本上我正在尝试编写一个GUI应用程序,它在主窗口中绘制两个圆圈和两个矩形。我试图得到它,这样每当用户在圆圈或矩形内单击时,特定的圆圈或矩形就会变成另一种随机颜色 目前,我已经得到了它,所以鼠标点击事件在屏幕上的任何地方都会导致所有的圆圈或矩形改变颜色,变成相同的颜色。 到目前为止,我得到的是: import java.awt.Color; import java.awt.Graphics; import java.awt.GridBagConstraints; import java.a
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Question2 {
public static void main(String[] args) {
SecondFrame f = new SecondFrame("Draw and Fill");
f.init();
}
}
class SecondFrame extends JFrame{
SecondFrame(String title) {
super(title);
}
private JPanel mainPanel;
private GridBagConstraints gbc = new GridBagConstraints();
private GridBagLayout gbLayout = new GridBagLayout();
void init() {
mainPanel = new JPanel();
mainPanel.setLayout(gbLayout);
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
this.setContentPane(mainPanel);
gbc.gridheight = 1;
mainPanel.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
Point mousePosition;
mousePosition = mainPanel.getMousePosition();
repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
});
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public void paint(Graphics g){
super.paint(g);
Random ran = new Random();
// Assumes max and min are non-negative.
int red = 0 + ran.nextInt(255 - 0 + 1);
int green = 0 + ran.nextInt(255 - 0 + 1);
int blue = 0 + ran.nextInt(255 - 0 + 1);
Color myColor = new Color(red,green,blue);
g.setColor(myColor);
g.fillOval(50,50,200,200);
g.fillOval(50, 255, 200, 200);
g.fillRect(255,50,200,200);
g.fillRect(255, 255, 200, 200);
}
}
如果你能给我指出正确的方向,我将不胜感激。谢谢。您应该使用鼠标定位来确定该点是否在任何椭圆或矩形的边界内。如果是,请执行g.setColormyColor并填充该形状。然后将g更改为正常的非随机颜色,并填充其余形状。您应该使用鼠标定位来确定该点是否在任何椭圆或矩形的边界内。如果是,请执行g.setColormyColor并填充该形状。然后将g更改为正常、非随机的颜色,并填充其余形状。您将跟踪绘制的对象。然后检查单击是否发生在这些对象中。如果是,请更改其颜色。例如,可以使用来表示简单表单。其contains方法可用于确定单击的点是否位于形状边界内。下面的示例介绍了ShapeItem,它有两个属性Shape和Color。以及使用ShapeItem列表绘制实际形状的面板
还考虑一些次要的注释:
不要直接在顶级容器(如JFrame)上涂漆。相反,使用JPanel或JComponent的扩展; 对于绘制,请覆盖paintComponent而不是paint,并且不要忘记调用super.paintComponent; 通常不需要扩展JFrame,除非添加了新功能; 有关更多详细信息,请参阅教程,特别是第节import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class DemoShapes {
public static final Color DEFAULT_COLOR = Color.BLUE;
public DemoShapes() {
List<ShapeItem> shapes = new ArrayList<ShapeItem>();
shapes.add(new ShapeItem(new Rectangle2D.Double(110, 1, 100, 100),
DEFAULT_COLOR));
shapes.add(new ShapeItem(new Rectangle2D.Double(110, 110, 100, 100),
DEFAULT_COLOR));
shapes.add(new ShapeItem(new Ellipse2D.Double(1, 1, 100, 100),
DEFAULT_COLOR));
shapes.add(new ShapeItem(new Ellipse2D.Double(1, 110, 100, 100),
DEFAULT_COLOR));
JFrame frame = new JFrame("Shapes");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ShapesPanel panel = new ShapesPanel(shapes);
frame.add(panel);
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}
class ShapeItem {
private Shape shape;
private Color color;
public ShapeItem(Shape shape, Color color) {
super();
this.shape = shape;
this.color = color;
}
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
}
class ShapesPanel extends JPanel {
private List<ShapeItem> shapes;
private Random rand = new Random();
public ShapesPanel(List<ShapeItem> shapesList) {
this.shapes = shapesList;
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Color color = getRandomColor();
for (ShapeItem item : shapes) {
if (item.getShape().contains(e.getPoint())) {
item.setColor(color);
}
}
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
for (ShapeItem item : shapes) {
g2.setColor(item.getColor());
g2.fill(item.getShape());
}
g2.dispose();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
private Color getRandomColor() {
return new Color(rand.nextFloat(), rand.nextFloat(),
rand.nextFloat());
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new DemoShapes();
}
});
}
}
您将跟踪绘制的对象。然后检查单击是否发生在这些对象中。如果是,请更改其颜色。例如,可以使用来表示简单表单。其contains方法可用于确定单击的点是否位于形状边界内。下面的示例介绍了ShapeItem,它有两个属性Shape和Color。以及使用ShapeItem列表绘制实际形状的面板
还考虑一些次要的注释:
不要直接在顶级容器(如JFrame)上涂漆。相反,使用JPanel或JComponent的扩展; 对于绘制,请覆盖paintComponent而不是paint,并且不要忘记调用super.paintComponent; 通常不需要扩展JFrame,除非添加了新功能; 有关更多详细信息,请参阅教程,特别是第节import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class DemoShapes {
public static final Color DEFAULT_COLOR = Color.BLUE;
public DemoShapes() {
List<ShapeItem> shapes = new ArrayList<ShapeItem>();
shapes.add(new ShapeItem(new Rectangle2D.Double(110, 1, 100, 100),
DEFAULT_COLOR));
shapes.add(new ShapeItem(new Rectangle2D.Double(110, 110, 100, 100),
DEFAULT_COLOR));
shapes.add(new ShapeItem(new Ellipse2D.Double(1, 1, 100, 100),
DEFAULT_COLOR));
shapes.add(new ShapeItem(new Ellipse2D.Double(1, 110, 100, 100),
DEFAULT_COLOR));
JFrame frame = new JFrame("Shapes");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ShapesPanel panel = new ShapesPanel(shapes);
frame.add(panel);
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}
class ShapeItem {
private Shape shape;
private Color color;
public ShapeItem(Shape shape, Color color) {
super();
this.shape = shape;
this.color = color;
}
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
}
class ShapesPanel extends JPanel {
private List<ShapeItem> shapes;
private Random rand = new Random();
public ShapesPanel(List<ShapeItem> shapesList) {
this.shapes = shapesList;
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Color color = getRandomColor();
for (ShapeItem item : shapes) {
if (item.getShape().contains(e.getPoint())) {
item.setColor(color);
}
}
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
for (ShapeItem item : shapes) {
g2.setColor(item.getColor());
g2.fill(item.getShape());
}
g2.dispose();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
private Color getRandomColor() {
return new Color(rand.nextFloat(), rand.nextFloat(),
rand.nextFloat());
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new DemoShapes();
}
});
}
}
超级有什么用;在ShapeItem的构造函数中?@cyberPheonix调用父构造函数。在本例中,这是由Java自动完成的,不需要显式地添加语句来调用父级的默认构造函数。它可能是由Eclipse的Generate构造函数使用字段自动生成的。。。选项。超级有什么用;在ShapeItem的构造函数中?@cyberPheonix调用父构造函数。在本例中,这是由Java自动完成的,不需要显式地添加语句来调用父级的默认构造函数。它可能是由Eclipse的Generate构造函数使用字段自动生成的。。。选项