自己写了个小程序。如下:
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鼠标事件驱动按钮
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鼠标事件驱动按钮
public void run() {
while(true) {
repaint();
try {
Thread.sleep(100);
} catch(InterruptedException e) {
}
}
}
});
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();
}
}