关于java事件驱动的问题

mmrx 2013-06-13 05:30:24
自己写了个小程序。如下:
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的问题?怎么样把二者联系起来?需要的效果是按那个按钮,线条变什么颜色,最好能有详细一些的说明,谢谢大神!
代码写的比较乱。。,顺便请教一下代码应该怎么布局
...全文
67 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mmrx 2013-06-13
  • 打赏
  • 举报
回复
引用 6 楼 wuyanxue 的回复:
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();
		
	}
}
谢谢谢谢,代码很清晰易懂~~~我主要问的是按钮和画线的部分怎么连接
摆烂办不到 2013-06-13
  • 打赏
  • 举报
回复
总之 要想解决你的问题 就要学习线程 推荐马士兵javaSE的视频 楼主可以去这个网站去下载http://www.bjsxt.com/shipinxiazai/
摆烂办不到 2013-06-13
  • 打赏
  • 举报
回复
引用 3 楼 llr19931113 的回复:
[quote=引用 1 楼 u010300707 的回复:] 你没有把按钮和按钮的事件处理连接在一起,你button要添加一个ActionListiner。就是redButton.addActionListener(this).后面的mounseListener也是一样的连接。
我连接了呀,在方法buttonAdd()里添加了监控器ButtonListener的[/quote] 哦 我没看见 如果还没学线程的话 那么你的窗口就是静态的
摆烂办不到 2013-06-13
  • 打赏
  • 举报
回复
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();
		
	}
}
mmrx 2013-06-13
  • 打赏
  • 举报
回复
引用 4 楼 wuyanxue 的回复:
Thread t = new Thread(new Runnable() {
		public void run() {
			while(true) {
				repaint();
				try {
					Thread.sleep(100);	
				} catch(InterruptedException e) {
					
				}
				
			}
		}
		});
您能把添加监听器的句子打一下么?没有看懂意思。。线程这块还没有自学到...
摆烂办不到 2013-06-13
  • 打赏
  • 举报
回复
Thread t = new Thread(new Runnable() {
		public void run() {
			while(true) {
				repaint();
				try {
					Thread.sleep(100);	
				} catch(InterruptedException e) {
					
				}
				
			}
		}
		});
mmrx 2013-06-13
  • 打赏
  • 举报
回复
引用 1 楼 u010300707 的回复:
你没有把按钮和按钮的事件处理连接在一起,你button要添加一个ActionListiner。就是redButton.addActionListener(this).后面的mounseListener也是一样的连接。
我连接了呀,在方法buttonAdd()里添加了监控器ButtonListener的
摆烂办不到 2013-06-13
  • 打赏
  • 举报
回复
引用 1 楼 u010300707 的回复:
你没有把按钮和按钮的事件处理连接在一起,你button要添加一个ActionListiner。就是redButton.addActionListener(this).后面的mounseListener也是一样的连接。
赞同楼上 但是就添加ActionListener是不行的 还要启动线程重画
点点_123 2013-06-13
  • 打赏
  • 举报
回复
你没有把按钮和按钮的事件处理连接在一起,你button要添加一个ActionListiner。就是redButton.addActionListener(this).后面的mounseListener也是一样的连接。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧