java - 如何在java中单击鼠标时更改颜色?
问题描述
我正在尝试制作自己的 Java GUI 项目。我想在按下鼠标时改变线条的颜色,但这不起作用。我对颜色使用了“for”循环和数组,但这没有运行。所以我想请你帮我解决它!另外,我想知道为什么循环需要在面板上画线。
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GraphicEx extends JFrame {
private MyPanel panel = new MyPanel();
public GraphicEx(){
setTitle("Java Mondrian");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(panel);
setSize(400,220);
setVisible(true);
}
class MyPanel extends JPanel{
private Vector <Point> vStart = new Vector <Point>();
private Vector <Point> vEnd = new Vector <Point>();
Color [] c = {Color.BLUE, Color.RED, Color.YELLOW, Color.BLACK};
private int a;
MyPanel(){
setBackground(Color.WHITE);
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
Point startP = e.getPoint();
vStart.add(startP);
for(int i=0; i<c.length; i++) {
if (i== (c.length-1)){
i=0;
}
a = i;
}
}
我为颜色更改做了这个,但这不起作用。
@Override
public void mouseReleased(MouseEvent e) {
super.mouseReleased(e);
Point endP = e.getPoint();
vEnd.add(endP);
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//component Color & Size
g.setColor(Color.BLACK);
g.drawRect(10,10,50,50);
g.setColor(Color.BLUE);
g.fillRect(60, 60, 100, 100);
g.setColor(Color.RED);
g.fillRect(50,50,20,20);
g.setColor(Color.YELLOW);
g.fillRect(130,50,50,50);
g.setColor(Color.RED);
g.drawRect(170,10,50,50);
g.setColor(Color.BLACK);
g.fillRect(210,50,80,50);
g.setColor(Color.YELLOW);
g.drawRect(260,30,40,170);
g.setColor(Color.RED);
g.fillRect(240,130,170,40);
g.setColor(new Color(0,0,0));
g.setFont(new Font("Arial",Font.ITALIC, 30));
g.drawString("Mondrian.2020", 100, 174);
g.setColor(new Color(0,210,200));
g.setFont(new Font("Arial",Font.BOLD,20));
g.drawString("Draw your own Picture", 70, 100);
g.setColor(new Color(0,0,0));
g.drawLine(20,20,350,20);
g.drawLine(35,0,35,180);
g.drawLine(20,160,350,160);
g.drawLine(330, 0, 330, 190);
int [] x = {80, 40, 80, 120};
int [] y = {40, 120, 200, 120};
g.drawPolygon(x,y,4);
g.setColor(Color.BLUE);
g.fillArc(290, 10, 50, 50, 90, 360);
for(int i=0; i<vStart.size();i++) {
Point s = vStart.elementAt(i);
Point e = vEnd.elementAt(i);
g.setColor(c[a]);
g.drawLine((int)s.getX(), (int)s.getY(), (int)e.getX(), (int)e.getY());
}
}
}
这部分我也看不懂!为什么我应该使用循环来画线?
public static void main(String[] args) {
new GraphicEx();
}
}
解决方案
由于颜色的供应有限,而且每一行都应该有自己的颜色,所以模运算符似乎很合适:
//Make sure both vectors have that index!
for(int i=0; i< Math.min(vStart.size(), vEnd.size()); i++) {
Point s = vStart.elementAt(i);
Point e = vEnd.elementAt(i);
g.setColor(c[i % c.length]); //Use a calculated color using modulo length
g.drawLine((int)s.getX(), (int)s.getY(), (int)e.getX(), (int)e.getY());
}
此外,访问不存在的元素(还)也不好。绘画可能随时发生 - 所以可能有开始项目没有结束项目。
如果这可行,您也可以摆脱 a 的整个计算。
推荐阅读
- ubuntu-18.04 - 在 Ubuntu 18 上为 Snowflake 安装 unixODBC 驱动程序...测试连接时出错
- typescript - 当我将类型验证代码移动到外部函数时,Typescript 报告错误“类型上不存在属性”
- javascript - 在 open-wc 测试中使用 sinon 存根点燃元素方法
- c - CLion 说“进程以退出代码 127 完成”
- presto - 如何在 Presto 中并行执行多个数组 unnest()
- javascript - NextJS 构建破坏 @material-ui/core 和 react-bootstrap 导入
- python - 收集推特数据集
- android - 不能与 ListFragment 中的自定义内容视图一起使用
- c# - 使用 .NET CORE 和 EF 从 165 个具有 30 种不同数据库架构的数据库中获取用户列表
- unit-testing - NUnit3TestExecutor 转换测试但没有运行它们