线程-在一个面板上交替显示红色的圆和绿色的圆

问题描述

在一个面板上交替显示红色的圆和绿色的圆
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class ShiYan04 {
public static void main(String args[])
{
Ckou ck=new Ckou();
}

}

class Ckou extends JFrame
{
public Ckou()
{
JFrame jframe=new JFrame(""变色圆"");
Container container=jframe.getContentPane();
jframe.setBackground(Color.BLUE);
jframe.setSize(600400);
jframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jframe.setVisible(true);

    Drawt dt=new Drawt();    container.add(dt);    JButton button=new JButton(""开始"");    button.setSize(30 30);    container.add(button);    button.addActionListener(new ActionListener()            {            public void actionPerformed(ActionEvent e)            {                  T2 t2=new T2(dt);                  Thread tt2=new Thread(t2);                  T1 t1=new T1(dtt2);                  Thread tt1=new Thread(t1);                  tt1.start();                  tt2.start();                  try                  {                         Thread.sleep(100000);                  }                  catch(Exception e3)                  {}            }            }            );}class T1 implements Runnable{    Drawt t;    T2 a;    public T1(Drawt tT2 a)    {        this.t=t;        this.a=a;    }    public void run()    {        while(true)        {            System.out.println(""现在显示绿色"");            a.stop=true;            t.i=1;            t.repaint();            try            {                Thread.sleep(3000);            }            catch(Exception e1)            {}            a.stop=false;            try            {                Thread.sleep(3000);            }            catch(Exception e1)            {}        }    }}class T2 implements Runnable{    volatile boolean stop = true;    Drawt t;    public T2(Drawt t)    {        this.t=t;    }    public void run()    {        while(!stop)        {            System.out.println(""现在显示红色"");            t.i=2;            try            {                Thread.sleep(3000);            }            catch(Exception e2)            {}        }    }}class Drawt extends JPanel{    int i=0;     public Drawt()     {}     public void paint(Graphics g)     {         if(i==1)         {              g.setColor(Color.green);             g.drawOval(10010070 70);         }         else if(i==2)         {             g.setColor(Color.red);             g.drawOval(15015070 70);          }     }}

}
首先他一直输出的是绿色的圆,
然后就是由于加上主线程main的睡眠,我的圆显示不出来

解决方案

你的代码存在的问题:
1)你的T2线程的while循环第一次执行就跳出了,导致红色线程一下就结束了。应该也是跟T1一样用while(true)内部操作时根据i的值绘图。
2)Button的宽度太小了,导致看不到文本值。
3)绘制圆形是两个不一样的圆形,所以看不到交替效果。
4)main线程sleep时间太长了,可以改小一点。
修正你的代码如下:

 import java.awt.Color;import java.awt.Container;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.WindowConstants;public class ShiYan04 {    public static void main(String args[]) {        Ckou ck = new Ckou();    }}class Ckou extends JFrame {    public Ckou() {        JFrame jframe = new JFrame(""变色圆"");        Container container = jframe.getContentPane();        jframe.setBackground(Color.BLUE);        jframe.setSize(600 400);        jframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);        jframe.setVisible(true);        Drawt dt = new Drawt();        container.add(dt);        JButton button = new JButton(""开始"");        button.setSize(100 30);        container.add(button);        button.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent e) {                T2 t2 = new T2(dt);                Thread tt2 = new Thread(t2);                T1 t1 = new T1(dt t2);                Thread tt1 = new Thread(t1);                tt1.start();                tt2.start();                try {                    Thread.sleep(100000);                } catch (Exception e3) {                }            }        });    }    class T1 implements Runnable {        Drawt t;        T2 a;        public T1(Drawt t T2 a) {            this.t = t;            this.a = a;        }        public void run() {            while (true) {                System.out.println(""现在显示绿色"");                a.stop = true;                t.i = 1;                t.repaint();                try {                    Thread.sleep(3000);                } catch (Exception e1) {                }                a.stop = false;                try {                    Thread.sleep(3000);                } catch (Exception e1) {                }            }        }    }    class T2 implements Runnable {        volatile boolean stop = true;        Drawt t;        public T2(Drawt t) {            this.t = t;        }        public void run() {            while (true) {                System.out.println(""stop :""+stop);                  System.out.println(""现在显示红色"");                t.i = 2;                try {                    Thread.sleep(3000);                } catch (Exception e2) {                }            }        }    }    class Drawt extends JPanel {        int i = 0;        public Drawt() {        }        public void paint(Graphics g) {            System.out.println(""paint i:""+i);            if (i == 1) {                g.setColor(Color.green);                g.drawOval(150 150 70 70);            } else if (i == 2) {                g.setColor(Color.red);                g.drawOval(150 150 70 70);            }else{                g.setColor(Color.ORANGE);                g.drawOval(150 150 70 70);            }        }    }}

测试OK。可以优化的是paint方法的g.drawOval代码放在外面,只在if分支中设置颜色,添加一个初始默认颜色。

        public void paint(Graphics g) {            System.out.println(""paint i:""+i);            if (i == 1) {                g.setColor(Color.green);            } else if (i == 2) {                g.setColor(Color.red);            }else{                g.setColor(Color.ORANGE);            }            g.drawOval(150 150 70 70);        }
时间: 2024-08-29 01:35:31

线程-在一个面板上交替显示红色的圆和绿色的圆的相关文章

winform线程修改界面上的显示问题

问题描述 winform程序,多线程,线程要在运行过程中修改界面上的显示.这样会造成界面很卡,我找了相关文章看了关于delegate,invoke等一些东西,但是一知半解,要懂不懂,,谁能给一个实际代码的例子点拨一下.谢谢了. 解决方案 解决方案二:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;

  具体操作步骤:   1、点击Win8系统资源管理器,然后在资源管理器面点击“工具”-“文件夹选项”;   2、在Win8系统文件夹选项窗口下,选择“查看”选项卡;   3、在Win8系统文件夹查看选项卡下,取消勾选“隐藏计算机文件夹中的空驱动器”和“隐藏受保护的操作系统文件”;   4、再选中“显示隐藏的文件、文件夹和驱动器”;   5、接着在Win8系统“我的电脑”面板上进入

 计算机文件夹中的空驱动器"和"隐藏受保护的操作系统文件"; 4.再选中"显示隐藏的文件.文件夹和驱动器"; 5.接着在Win8系统"我的电脑"面板上进入-win8系统修复工具"> 具体操作步骤: 1.点击Win8系统资源管理器,然后在资源管理器面点击"工具"-"文件夹选项"; 2.在Win8系统文件夹选项窗口下,选择"查看"选项卡; 3.在Win8系统文件夹查

android-如何做到在一个平台上运行,另一个平台上显示操作运行界面?

问题描述 如何做到在一个平台上运行,另一个平台上显示操作运行界面? 应用程序是mfc开发的,运行在一个没有显示器的windows系统中,称之为A 在另一个ipad(称之为B)上可以看到A上运行的程序的界面,并且界面的按钮等等都可以操作,就像是直接在A上操作一样 A和B之间通过wifi连接,在A上跑了一个什么server,在B上用html的方式来显示操作A上的程序. 这样的好处似乎是,可以跨平台显示操作他们的程序(mfc开发,只能在windows上运行),例如iOS,android? 具体这是如何

java-Java接收一个有关地图的XML,如何解析这个地图XML文件并把它显示在一个窗口上?

问题描述 Java接收一个有关地图的XML,如何解析这个地图XML文件并把它显示在一个窗口上? 请问,如果Myeclipse接收了一个XML文件,里面是关于绘制地图的点,线,位置坐标等的信息, 那该如何解析这个XML?最终目的是想把描述地图的XML文件能显示出一幅地图来? 有没有关于显示地图方面的代码参考,或者能指点一下思路,谢谢 解决方案 处理xml格式的文件或者文本字符串的话,需要使用java的xml处理工具如jdom,或dom4j都可以的. 其实本质上就是对xml的节点进行解析获取数据信息

网络考试时点击右侧选题面板上的题号,就可以快速定位到该题,而且答过的题题号变色显示。

问题描述 网络考试时点击右侧选题面板上的题号,就可以快速定位到该题,而且答过的题题号变色显示.类似效果http://m.baidu.com/tc?from=openapp_bdimage_mobile&srd=1&dict=20&src=http%3A%2F%2Fwww.xymzxx.com%2Fxwgk%2FShowArticle.asp%3FArticleID%3D248

想在面板上显示动态变化的一个字符串,怎样做?(在线等)

问题描述 想在面板上显示动态变化的一个字符串,怎样做? 解决方案 解决方案二:不知道你说的面板是不是Swing的?下面是代码,packageswing;importjava.awt.BorderLayout;importjava.awt.Container;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;publicclassMain{publicstaticvoidmain(String[]a

十万条数据如何显示在一个页面上而不至于让浏览器处于无响应状态

问题描述 十万条数据如何显示在一个页面上而不至于让浏览器处于无响应状态 十万条数据如何显示在一个页面上而不至于让浏览器处于无响应状态 解决方案 瓶颈在哪?sql查询太慢?10w你的数据库就受不了了?什么数据库,sql怎么写的,总数据量是多少? 解决方案二: 异步加载啊,加载多少显示多少

三星S6 edge如何取消在通知面板上显示智能遥控器?(G9250)

  若需取消在通知面板上显示智能遥控器,请按以下步骤操作:  1.在待机页面下,点击[应用程序].    2.点击[实用工具].    3.点击[智能遥控器].    4.点击左上角的[菜单]图标.    5.点击[设定].    6.向上滑动屏幕,点击[在通知面板上显示遥控器]右侧的滑块,灰色代表关闭.     

打印机面板上的状态指示灯长亮红色,如何处理

当机器面板上的状态指示灯长亮红色时,请按照以下步骤排除:  如图:机器面板上的状态指示灯     一.检查前盖是否关上 前盖没有关闭,关上前盖. 二.检查纸张是否正确装入纸盘   纸盘构架图:    1.拉出纸盘.   2.请在装入纸张之前将纸摞边弯折或成扇形展开,使纸张分离.    3.将纸张打印面朝上放置.    4.调整纸张长度导板和宽度导板,使其触及纸叠的边缘但又不会让纸叠打弯.     5.最后将纸盘重新放回机器中.   三.成像装置几乎已达到其预计墨盒寿命,建议更换成像装置(请点击这