gpt4 book ai didi

java - 制作一个绘画程序,改变之前位置的颜色

转载 作者:行者123 更新时间:2023-12-02 06:09:57 25 4
gpt4 key购买 nike

我正在制作一个小型绘画程序,其左侧基本上有按钮,指示颜色,无论您在何处单击并拖动,它都会使用图形绘制一个圆圈。我知道,根本没有效率,我可以使用笔画和其他东西,但我仍在学习,但还没有做到这一点,所以我用我所知道的来测试它。一切似乎都正常,只是有一个小问题。我可以单击、拖动,然后绘制一条线。但是当我改变颜色并绘制其他东西时,绘制的第一个圆圈是以前的颜色。我尝试了很多事情但似乎无法解决它。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.Timer;


public class painting extends JFrame{

ArrayList<Integer> mouseLocXList = new ArrayList<Integer>();
ArrayList<Integer> mouseLocYList = new ArrayList<Integer>();
ArrayList<Color> colors = new ArrayList<Color>();
Color colorChosen = Color.black;

String[] colorsSideBarButtonString = {"Red", "Blue", "Green", "Orange", "Pink"};
Color[] colorsSideBar = {Color.red, Color.blue, Color.green, Color.orange ,
Color.pink};
JButton[] buttons = new JButton[colorsSideBarButtonString.length];


public painting(){
setSize(1200,700);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setBackground(Color.WHITE);
setLayout(null);
setFocusable(true);

addMouseMotionListener(new handler());

colors.add(Color.black);

for(int x = 0; x < colorsSideBarButtonString.length; x++){
buttons[x] = new JButton(colorsSideBarButtonString[x]);
buttons[x].setBounds(2,(x*50)+30,70,46);
add(buttons[x]);
buttons[x].addActionListener(new buttonListener());
}

setVisible(true);
}

public static void main(String[] args){
new painting();
}

public void paint(Graphics g){
super.paint(g);

g.setColor(Color.black);
g.drawLine(72, 0, 72, 900);
g.drawLine(1150, 0, 1150, 900);
g.drawString("Colors", 17, 45);

for(int i = 0; i < mouseLocXList.size(); i++){
g.setColor(colors.get(i));
g.fillOval(mouseLocXList.get(i),mouseLocYList.get(i),30,30);
}

}

public class handler implements MouseMotionListener{

public void mouseDragged(MouseEvent e) {
mouseLocXList.add(e.getX());
mouseLocYList.add(e.getY());
colors.add(colorChosen);
repaint();
}
public void mouseMoved(MouseEvent e) {
}

}

public class buttonListener implements ActionListener{

public void actionPerformed(ActionEvent e) {
for(int c = 0; c < buttons.length; c++)
if(e.getSource() == buttons[c]){
colorChosen = colorsSideBar[c];
}
}

}


}

抱歉,程序有点长,我不知道在哪里可以缩短它,一切似乎都是必要的。基本上,每次单击并拖动鼠标时,其位置都会存储在一个数组中,然后在图形中的 for 循环中绘制。单击颜色,并将其添加到其自己的数组中,并且每次拖动时更新鼠标位置,当前颜色都会添加到颜色数组中,以便可以在 for 循环中重新绘制颜色。我认为解决问题的最好方法是运行它。

再一次,我知道这可能是您见过的最糟糕的编写程序之一。我明白,但我只是在测试并尝试看看我能做到多先进。

最佳答案

绘画具有破坏性,即每次paint被调用,它将清除/删除之前绘制的内容。

这非常重要,因为Graphics上下文由绘制周期中绘制的所有组件共享,这意味着,当它到达您时,它可能已经绘制了一些东西。

你需要做两件事。

首先,您需要创建可绘制的东西,即某种提供简单 paint 的对象。或draw您可以通过 Graphics 的方法上下文到.这个对象应该知道它在画什么以及用什么颜色

其次,您需要将每个“可绘制”对象添加到 List它们被创建时的某种类型。这将允许您循环遍历 List并在需要时重新绘制它们。

您应该避免覆盖 paint顶级容器,如 JFrame ,除了它们不是双缓冲并且更新时会产生闪烁这一事实之外,您最终可能会在框架装饰的边框下进行绘画(0x0实际上是窗口/框架的左上角,而不是窗口/框架下的可视区域)框架的标题栏)。

相反,请使用 JPanel并覆盖它的 paintComponent方法

看看Performing Custom PaintingPainting in AWT and Swing了解更多详情

已更新...

您的颜色列表与鼠标点不同步,因为您...

colors.add(Color.black);

在构造函数中。这意味着第一个圆圈将涂成黑色,下一个圆圈将涂成所选颜色。当你改变颜色时,它仍然不同步

关于java - 制作一个绘画程序,改变之前位置的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21977591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com