自己写了个小程序。如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class MousePaint extends JFrame{

private JButton redButton = new JButton("RED");
private JButton blackButton = new JButton("BLACK");
private JButton greenButton = new JButton("Green");
private Graphics g;

public MousePaint(){
JPanel pCenter = new JPanel();
JPanel pRight = new JPanel();

pCenter.setLayout(new BorderLayout());
pCenter.add(new MousePanel(),BorderLayout.CENTER);

pRight.setLayout(new GridLayout(0,1));
pRight.add( redButton);
pRight.add( blackButton);
pRight.add( greenButton);

getContentPane().setLayout(new BorderLayout());
getContentPane().add(pCenter,BorderLayout.CENTER);
getContentPane().add(pRight,BorderLayout.EAST);

buttonAdd();
}

private void buttonAdd(){
ButtonListener buttonListener = new ButtonListener();
redButton.addActionListener(buttonListener);
blackButton.addActionListener(buttonListener);
greenButton.addActionListener(buttonListener);

}

class ButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getSource() == redButton ){
g.setColor(Color.RED);
}
if(e.getSource() == blackButton ){
g.setColor(Color.BLACK);
}
if(e.getSource() == greenButton ){
g.setColor(Color.GREEN);
}
}
}

class MousePanel extends JPanel
implements MouseListener,MouseMotionListener{

final int CIRCLESIZE = 100;
private Point lineStart = new Point(0,0);


public MousePanel(){
addMouseListener(this);
addMouseMotionListener(this);
}

public void mouseClicked(MouseEvent e){
}
public void mouseEntered(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
public void mouseReleased(MouseEvent e){
}
public void mousePressed(MouseEvent e){
lineStart.move(e.getX(),e.getY());
}
public void mouseDragged(MouseEvent e){
g = getGraphics();

if(e.isMetaDown()){//right button
g.setColor(getBackground());
g.fillOval(e.getX()-CIRCLESIZE/4, e.getY()-CIRCLESIZE/4, CIRCLESIZE/2, CIRCLESIZE/2);
}
else{
g.setColor(Color.BLACK);
g.drawLine(lineStart.x, lineStart.y, e.getX(), e.getY());
}

lineStart.move(e.getX(), e.getY());

g.dispose();
}
public void mouseMoved(MouseEvent e){
}
}

public static void main(String[] args){
MousePaint frame = new MousePaint();
// frame.pack();
frame.setSize(400,400);
frame.setTitle("MousePaint");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
} }我想用三个按钮来改变线条的颜色,弄了半天总是不行。应该是按钮和鼠标移动两块代码衔接不上,是不是那个Graphics变量g的问题?怎么样把二者联系起来?需要的效果是按那个按钮,线条变什么颜色,最好能有详细一些的说明,谢谢大神!
代码写的比较乱。。,顺便请教一下代码应该怎么布局Java鼠标事件驱动按钮

解决方案 »

  1.   

    你没有把按钮和按钮的事件处理连接在一起,你button要添加一个ActionListiner。就是redButton.addActionListener(this).后面的mounseListener也是一样的连接。
      

  2.   

    赞同楼上  但是就添加ActionListener是不行的  还要启动线程重画
      

  3.   

    我连接了呀,在方法buttonAdd()里添加了监控器ButtonListener的
      

  4.   

    Thread t = new Thread(new Runnable() {
    public void run() {
    while(true) {
    repaint();
    try {
    Thread.sleep(100);
    } catch(InterruptedException e) {

    }

    }
    }
    });
      

  5.   

    import java.awt.*;import javax.swing.*;
    import javax.swing.event.*;
    import java.util.Random;public class Test extends JPanel{

    Random r = new Random();
    //重画的线程
    Thread t = new Thread(new Runnable() {
    public void run() {
    while(true) {
    repaint();
    try {
    Thread.sleep(100);
    } catch(InterruptedException e) {

    }

    }
    }
    });
    //重写父类的paintComponent方法
    protected void paintComponent(Graphics g) {

    g.setColor(new Color(r.nextInt(100),r.nextInt(100),r.nextInt(100)));
    g.fillRect(10,10,400,400);

    }

    public static void main(String args[]) {
    Test t1 = new Test();
    JFrame f = new JFrame();
    f.setBounds(100,100,500,500);
    f.setVisible(true);
    t1.setBounds(100,100,500,500);
    f.add(t1);
    t1.t.start();

    }
    }
      

  6.   

    我连接了呀,在方法buttonAdd()里添加了监控器ButtonListener的哦 我没看见如果还没学线程的话 那么你的窗口就是静态的 
      

  7.   

    总之 要想解决你的问题 就要学习线程 推荐马士兵javaSE的视频  楼主可以去这个网站去下载http://www.bjsxt.com/shipinxiazai/