【问题标题】:Making a paint program, previous location color changing制作绘画程序,改变之前的位置颜色
【发布时间】:2014-02-24 01:58:32
【问题描述】:

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

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 循环中重新绘制颜色。我认为解决问题的最佳方法是运行它。

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

【问题讨论】:

    标签: java swing graphics jframe mouse


    【解决方案1】:

    绘制是破坏性的,也就是说,每次调用paint,它都会清除/删除之前绘制的内容。

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

    你需要做两件事。

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

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

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

    改为使用JPanel 并覆盖它的paintComponent 方法

    查看Performing Custom Painting 和Painting in AWT and Swing 了解更多详情

    更新...

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

    colors.add(Color.black);
    

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

    【讨论】:

    • 我理解正确的方法,但我想说的是我这里有一个工作程序,只是一个测试。我知道它的问题,作为一个 JFrame 和 paint() 等等,但我的问题是代码中的一些小问题,我根本找不到。这就是我正在寻找的一切。谢谢。
    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 2012-07-05
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多