本事想写一个用三个按钮控制三个线程画矩形的,可是他们都不工作。
本人刚学java,菜鸟一枚,求各种前辈不吝赐教,在此多谢。//ThreadTest.javaimport java.awt.*;
import javax.swing.*;public class ThreadTest {



public static void main(String[] args)
{
Toolkit tk=Toolkit.getDefaultToolkit();
Dimension screenSize=tk.getScreenSize();
int screenWidth=screenSize.width;
int screenHeight=screenSize.height;

ThreadFrame threadFrame=new ThreadFrame();
threadFrame.setLocation(screenWidth/3, screenHeight/5);

    threadFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    threadFrame.setVisible(true);
}
}
//ThreadFrame,javaimport java.awt.*;
import java.awt.event.*;
import javax.swing.*;class ThreadFrame extends JFrame 
{
DrawThread draw=new DrawThread(50,50,20,10);
Container contentPane=getContentPane();
JPanel panel1=new JPanel();
JPanel panel2=new JPanel();

JButton button1=new JButton("线程1开始");
JButton button2=new JButton("线程2开始");
JButton button3=new JButton("线程3开始");

public ThreadFrame()
{
setTitle("线程并发执行演示");
setSize(480,480);

panel2.add(button1);
panel2.add(button2);
panel2.add(button3);

repaint();

button1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(draw.start==0)
{
DrawThread draw1=new DrawThread(50,50,20,5);
draw1.start();
draw.start=1;
button1.setText("线程1暂停");
}
else if(draw.start==1)
{
draw.change();
button1.setText("线程1开始");
}
else
{
draw.change();
button1.setText("线程1暂停");
}

}
});

button2.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(draw.start==0)
{
DrawThread draw2=new DrawThread(50,50,20,5);
draw2.start();
draw.start=1;
button2.setText("线程2暂停");
}
else if(draw.start==1)
{
draw.change();
button2.setText("线程2开始");
}
else
{
draw.change();
button2.setText("线程2暂停");
}
}
});

button3.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(draw.start==0)
{
DrawThread draw3=new DrawThread(50,50,20,5);
draw3.start();
draw.start=1;
button3.setText("线程3暂停");
}
else if(draw.start==1)
{
draw.change();
button3.setText("线程3开始");
}
else
{
draw.change();
button3.setText("线程3暂停");
}
}
});

contentPane.add(panel1,BorderLayout.NORTH);
contentPane.add(panel2,BorderLayout.SOUTH);
}

public void paintComponent(Graphics g)
{
super.paintComponents(g);

g.drawString("线程1", 10, 50);
g.drawString("线程2", 10, 100);
g.drawString("线程3", 10, 150);
}

class DrawThread extends Thread
{
int x, y,WIDTH,HEIGHT;
int start;
int speed;
DrawThread(int x, int y, int HEIGHT,int speed) 
{
this.x = x;
this.y = y;
this.HEIGHT = HEIGHT;   //矩形的高
this.speed = speed;
this.start = 0;
} public void drawMe()
        {
Graphics g = panel1.getGraphics();     //把画笔给panel1
g.setColor(Color.red);
g.fillRect(x, y,WIDTH,HEIGHT );        //panel1自己在画矩形
} public void change()     //改变标志
{
this.start *= -1;
} public void run() 
{ while (true)    //循环执行
{
this.drawMe();    //panel1画矩形
if (start == 1)
{
if (WIDTH > 400) 
{
Graphics g = panel1.getGraphics();
Color c = g.getColor();
g.setColor(Color.white);
g.fillRect(x, y,WIDTH,HEIGHT );
g.setColor(c);
WIDTH = 0;
}
WIDTH += speed;

}
try 
{
Thread.sleep(100);

catch (Exception e) {}
}
} }

}

解决方案 »

  1.   


    我swing也不是很好,大概帮你看了下,问题有几点
    首先,
    contentPane.add(panel1, BorderLayout.NORTH);
    这个panel1就在界面上面,很小的一块
    你可以用panel1.setBackground(Color.red);看看具体是什么样子的
    你的它的画笔来画,我不知道会有什么问题第二,
    DrawThread这个的WIDTH一直是0,你自己调试看看我改了两句contentPane.add(panel1, BorderLayout.CENTER);drawMe()里面加了WIDTH=30;
    现在能够看到一块红的,因为具体不知道你要干什么,
    你可以照着改了再调看看
      

  2.   

    关键还是在start的控制上,我想用三个线程演示同时画矩形,单个或两个一起画矩形,由于cpu分配资源的问题,我想实现的就是一个线程工作是画的非常快,因为现在只有他一个占用cpu,三个一起画就速度就满了,我知道每个线程停止时要让他释放自己的锁,好像要用到wait(),notify()。
    有木有人能帮我实现下。代码我改了一下,可以运行了,但是不能体现cpu的时间转轮调度算法,要让停止的线程释放它所占的资源。import java.awt.*;
    import javax.swing.*;public class ThreadTest {



    public static void main(String[] args)
    {
    Toolkit tk=Toolkit.getDefaultToolkit();
    Dimension screenSize=tk.getScreenSize();
    int screenWidth=screenSize.width;
    int screenHeight=screenSize.height;

    ThreadFrame threadFrame=new ThreadFrame();
    threadFrame.setLocation(screenWidth/3, screenHeight/5);

        threadFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        threadFrame.setVisible(true);
    }
    }
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;class ThreadFrame extends JFrame 
    {
    DrawThread draw=new DrawThread(50,50,20,10);
    Container contentPane=getContentPane();
    JPanel panel1=new JPanel();
    JPanel panel2=new JPanel();

    JButton button1=new JButton("线程1开始");
    JButton button2=new JButton("线程2开始");
    JButton button3=new JButton("线程3开始");

    public ThreadFrame()
    {
    setTitle("线程并发执行演示");
    setSize(480,480);

    panel2.add(button1);
    panel2.add(button2);
    panel2.add(button3);

    repaint();

    button1.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    DrawThread draw1=new DrawThread(50,50,20,5);
    draw1.start();
    button1.setText("线程1暂停");

    }
    });

    button2.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    DrawThread draw2=new DrawThread(50,150,20,5);
    draw2.start();
    button2.setText("线程2暂停");
    }
    });

    button3.addActionListener(new ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {

    DrawThread draw3=new DrawThread(50,250,20,5);
    draw3.start();
    button3.setText("线程3暂停");
    }
    });

    contentPane.add(panel1,BorderLayout.CENTER );
    contentPane.add(panel2,BorderLayout.SOUTH);
    }

    public void paintComponent(Graphics g)
    {
    super.paintComponents(g);

    g.drawString("线程1", 10, 50);
    g.drawString("线程2", 10, 100);
    g.drawString("线程3", 10, 150);
    }

    class DrawThread extends Thread
    {
    int x, y,WIDTH=0,HEIGHT;
    int start;
    int speed;
    DrawThread(int x, int y, int HEIGHT,int speed) 
    {
    this.x = x;
    this.y = y;
    this.HEIGHT = HEIGHT;   //矩形的高
    this.speed = speed;
    this.start = 1;
    } public void drawMe()
            {
    Graphics g = panel1.getGraphics();     //把画笔给panel1
    g.setColor(Color.red);
    g.fillRect(x, y,WIDTH,HEIGHT );        //panel1自己在画矩形
    } public void change()     //改变标志
    {
    this.start *= -1;
    } public void run() 
    {
    while (true)          //循环执行
    {
    this.drawMe();    //panel1画矩形
    if (start == 1)
    {
    if (WIDTH > 400) 
    {
    Graphics g = panel1.getGraphics();
    Color c = g.getColor();
    g.setColor(Color.white);
    g.fillRect(x, y,WIDTH,HEIGHT );
    g.setColor(c);
    WIDTH = 0;
    }
    WIDTH += speed;


    }
    try 
    {
    Thread.sleep(100);

    catch (Exception e) {}
    }
    } }

    }
      

  3.   

    按你说的改了下,也许是这个样子?
    我之改了第一个按钮class ThreadFrame extends JFrame {
    DrawThread draw = new DrawThread(50, 50, 20, 10);
    Container contentPane = getContentPane();
    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel(); JButton button1 = new JButton("线程1开始");
    JButton button2 = new JButton("线程2开始");
    JButton button3 = new JButton("线程3开始"); DrawThread draw1;
    DrawThread draw2 = new DrawThread(50, 150, 20, 5);
    DrawThread draw3 = new DrawThread(50, 250, 20, 5);

    public ThreadFrame() {
    setTitle("线程并发执行演示");
    setSize(480, 480); panel2.add(button1);
    panel2.add(button2);
    panel2.add(button3); repaint(); button1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    if(draw1 == null){
    draw1 = new DrawThread(50, 50, 20, 5);
    draw1.start = 1;
    draw1.start();
    }else{
    draw1.change();
    if(draw1.start == -1)
    try {
    draw1.suspend();
    } catch (Exception e1) {
    e1.printStackTrace();
    }
    else
    draw1.resume();
    }
    button1.setText("线程1暂停");
    }
    }); button2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {

    draw2.start();
    button2.setText("线程2暂停");
    }
    }); button3.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    draw3.start();
    button3.setText("线程3暂停");
    }
    }); contentPane.add(panel1, BorderLayout.CENTER);
    contentPane.add(panel2, BorderLayout.SOUTH);
    } public void paintComponent(Graphics g) {
    super.paintComponents(g); g.drawString("线程1", 10, 50);
    g.drawString("线程2", 10, 100);
    g.drawString("线程3", 10, 150);
    } class DrawThread extends Thread {
    int x, y, WIDTH = 0, HEIGHT;
    int start = -1;
    int speed; DrawThread(int x, int y, int HEIGHT, int speed) {
    this.x = x;
    this.y = y;
    this.HEIGHT = HEIGHT; // 矩形的高
    this.speed = speed;
    } public void drawMe() {
    Graphics g = panel1.getGraphics(); // 把画笔给panel1
    g.setColor(Color.red);
    g.fillRect(x, y, WIDTH, HEIGHT); // panel1自己在画矩形
    } public void change() // 改变标志
    {
    this.start *= -1;
    } public void run() {
    while (true) // 循环执行
    {
    this.drawMe(); // panel1画矩形
    if (start == 1) {
    if (WIDTH > 400) {
    Graphics g = panel1.getGraphics();
    Color c = g.getColor();
    g.setColor(Color.white);
    g.fillRect(x, y, WIDTH, HEIGHT);
    g.setColor(c);
    WIDTH = 0;
    }
    WIDTH += speed; }
    try {
    Thread.sleep(100);
    } catch (Exception e) {
    }
    }
    } }}
      

  4.   

    我改了下,但是还是不能让暂停的线程把他的cpu资源让出来,就是每个线程画矩形的速度不受其他两个线程的影响,查了一下,说要用wait和notify,但是要和synchronized一起用,我不是太懂,能不能帮我改下,还有按钮的名称我怎么改不了。import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;class ThreadFrame extends JFrame {
        Container contentPane = getContentPane();
        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
     
        JButton button1 = new JButton("线程1开始");
        JButton button2 = new JButton("线程2开始");
        JButton button3 = new JButton("线程3开始");
     
        DrawThread draw1,draw2,draw3;  
         
        public ThreadFrame() {
            setTitle("线程并发执行演示");
            setSize(480, 480);
     
            panel2.add(button1);
            panel2.add(button2);
            panel2.add(button3);
     
            button1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if(draw1 == null){
                        draw1 = new DrawThread(50, 50, 20, 3);
                        draw1.start = 1;
                        draw1.start();
                    }else{
                        draw1.change();
                        if(draw1.start == -1)
                            try {
                                draw1.wait();
                                button1.setText("线程1开始");
                            } 
                            catch (Exception e1) {
                                e1.printStackTrace();
                            }
                        else
                        {
                            draw1.notify();
                            button1.setText("线程1暂停");
                        }
                    }
                }
            });
     
            button2.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                 if(draw2 == null){
                 draw2 = new DrawThread(50, 75, 20, 3);
                 draw2.start = 1;
                 draw2.start();
                    }else{
                     draw2.change();
                        if(draw2.start == -1)
                            try {
                             draw2.wait();
                             button1.setText("线程2开始");
                            } 
                            catch (Exception e1) {
                                e1.printStackTrace();
                            }
                        else
                        {
                         draw2.notify();
                         button1.setText("线程2暂停");
                        }
                    }
                }
            });
     
            button3.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
     
                 if(draw3 == null){
                 draw3 = new DrawThread(50, 100, 20, 3);
                 draw3.start = 1;
                 draw3.start();
                    }else{
                     draw3.change();
                        if(draw3.start == -1)
                            try {
                             draw3.wait();
                             button1.setText("线程3开始");
                            } 
                            catch (Exception e1) {
                                e1.printStackTrace();
                            }
                        else
                        {
                         draw3.notify();
                         button1.setText("线程3暂停");
                        }
                    }
                }
            });
     
            contentPane.add(panel1, BorderLayout.CENTER);
            contentPane.add(panel2, BorderLayout.SOUTH);
            
        }
     
     
        class DrawThread extends Thread 
        {
            int x, y, WIDTH = 0, HEIGHT;
            int start = -1;
            int speed;
     
            DrawThread(int x, int y, int HEIGHT, int speed)
            {
                this.x = x;
                this.y = y;
                this.HEIGHT = HEIGHT; // 矩形的高
                this.speed = speed;
            }
     
            public void drawMe() 
            {
                Graphics g = panel1.getGraphics(); // 把画笔给panel1
                g.setColor(Color.red);
                g.fillRect(x, y, WIDTH, HEIGHT); // panel1自己在画矩形
            }
     
            public void change() // 改变标志
            {
                this.start *= -1;
            }
     
            public synchronized void run() 
            {
                while (true) // 循环执行
                {
                    this.drawMe(); // panel1画矩形
                    if (start == 1)
                    {
                        if (WIDTH > 400)
                        {
                            Graphics g = panel1.getGraphics();
                            Color c = g.getColor();
                            g.setColor(Color.white);
                            g.fillRect(x, y, WIDTH, HEIGHT);
                            g.setColor(c);
                            WIDTH = 0;
                        }
                        WIDTH += speed;
     
                    }
                    try {
                        Thread.sleep(80);
                    } catch (Exception e) {}
                }
            }
        }
        
        public static void main(String[] args)
        {
         Toolkit tk=Toolkit.getDefaultToolkit();
    Dimension screenSize=tk.getScreenSize();
    int screenWidth=screenSize.width;
    int screenHeight=screenSize.height;

    ThreadFrame threadFrame=new ThreadFrame();
    threadFrame.setLocation(screenWidth/3, screenHeight/5);

        threadFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        threadFrame.setVisible(true);
        }
     
    }