swing206界面线程与工作线程

事件循环

在这里插入图片描述

package my;

import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Swing2
{
	private static void createGUI()
	{
		// JFrame指一个窗口,构造方法的参数为窗口标题
		// 语法:因为MyFrame是JFrame的子类,所以可以这么写
		JFrame frame = new MyFrame("Swing Demo");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		// 设置窗口的其他参数,如窗口大小
		frame.setSize(500, 300);
		
		// 显示窗口
		frame.setVisible(true);
		
		
	}
	
	public static void main(String[] args)
	{
		// 此段代码间接地调用了 createGUI(),具体原理在 Swing高级篇 里讲解
		// 初学者先照抄此代码框架即可
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run()
			{
				createGUI();
			}
		});

	}
}

package my;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MyFrame extends JFrame
{
	JTextField textField = new JTextField(20);
	JButton okButton = new JButton("OK");
	
	public MyFrame(String title)
	{
		super(title);

		// Content Pane
		JPanel root = new JPanel();
		this.setContentPane(root);
		root.setLayout(new FlowLayout());

		root.add(textField);
		root.add(okButton);
		
		okButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e)
			{
				textField.setText("2019-02-14");
			}			
		});
	}

	
}

界面卡顿

在这里插入图片描述

package my;

import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MyFrame extends JFrame
{
	JTextField textField = new JTextField(20);
	JButton okButton = new JButton("OK");
	
	public MyFrame(String title)
	{
		super(title);

		// Content Pane
		JPanel root = new JPanel();
		this.setContentPane(root);
		root.setLayout(new FlowLayout());

		root.add(textField);
		root.add(okButton);
		
		okButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e)
			{				
				onMouseClicked();				
			}			
		});
	}

	// 按钮点击事件处理
	private void onMouseClicked()
	{
		try
		{
			System.out.println("Ma");
			Thread.sleep(3000); 
			
			System.out.println("Mi");
			Thread.sleep(3000); 
			
			System.out.println("Hong");
			Thread.sleep(3000);
			
		} catch (Exception e1){} 
	}
}

创建工作线程

在这里插入图片描述

package my;

import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MyFrame extends JFrame
{
	JTextField textField = new JTextField(20);
	JButton okButton = new JButton("OK");
	
	public MyFrame(String title)
	{
		super(title);

		// Content Pane
		JPanel root = new JPanel();
		this.setContentPane(root);
		root.setLayout(new FlowLayout());

		root.add(textField);
		root.add(okButton);
		
		okButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e)
			{				
				onMouseClicked();				
			}			
		});
	}

	// 按钮点击事件处理
	private void onMouseClicked()
	{
		MyWorkThread th = new MyWorkThread();
		th.start();
	}
	
	private class MyWorkThread extends Thread
	{

		@Override
		public void run()
		{
			try
			{
				System.out.println("Ma");
				Thread.sleep(3000); 
				
				System.out.println("Mi");
				Thread.sleep(3000); 
				
				System.out.println("Hong");
				Thread.sleep(3000);
				
			} catch (Exception e1){} 
		}
		
	}
}

更新界面

在这里插入图片描述

package my;

import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class MyFrame extends JFrame
{
	JTextField textField = new JTextField(20);
	JButton okButton = new JButton("OK");
	
	public MyFrame(String title)
	{
		super(title);

		// Content Pane
		JPanel root = new JPanel();
		this.setContentPane(root);
		root.setLayout(new FlowLayout());

		root.add(textField);
		root.add(okButton);
		
		okButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e)
			{				
				onMouseClicked();				
			}			
		});
	}

	// 按钮点击事件处理
	private void onMouseClicked()
	{
		MyWorkThread th = new MyWorkThread();
		th.start();
	}
	
	private class MyWorkThread extends Thread
	{

		@Override
		public void run()
		{
			try
			{
				updateUI("Ma");
				Thread.sleep(3000); 
				
				updateUI("Mi");
				Thread.sleep(3000); 
				
				updateUI("Hong");
				Thread.sleep(3000);
				
			} catch (Exception e1){} 
		}
		
		// 更新界面
		private void updateUI(String progress)
		{
			SwingUtilities.invokeLater( new Runnable() {				
				@Override
				public void run()
				{
					// 在匿名类里,也可以直接访问上层方法里的局部变量
					// 比如, progress就是一个局部变量
					// 这个语法真要解释起来比较复杂,大家直接用就行,先不要管那么多
					textField.setText( progress );
				}
			});
		}
	}
}

倒计时练习

在这里插入图片描述

package my;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

public class MyFrame extends JFrame
{
	JLabel display = new JLabel("准备");
	JButton okButton = new JButton("开始");
	
	public MyFrame(String title)
	{
		super(title);

		// Content Pane
		JPanel root = new JPanel();
		this.setContentPane(root);
		root.setLayout(new BorderLayout());

		root.add(okButton, BorderLayout.PAGE_START);
		root.add(display, BorderLayout.CENTER);
				
		display.setFont(new Font("宋体", Font.PLAIN, 80));
		display.setHorizontalAlignment(SwingConstants.CENTER);
		display.setOpaque(true);
		display.setBackground(Color.WHITE);
		display.setForeground(Color.BLUE);
		
		okButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e)
			{				
				onMouseClicked();				
			}			
		});
	}

	// 按钮点击事件处理
	private void onMouseClicked()
	{
		okButton.setEnabled(false); // 禁用按钮
		
		MyWorkThread th = new MyWorkThread();
		th.start();		
	}
	
	private class MyWorkThread extends Thread
	{
		@Override
		public void run()
		{
			int n = 5;
			while(n > 0)
			{
				// 更新界面:显示倒计时
				
				// 语法:传到内部类使用的局部变量,必须为final ( 默认final)
				final String text = String.valueOf(n);
				SwingUtilities.invokeLater ( ()->{
					//在内部类里可以直接使用外部方法的final局部变量
					display.setText( text ); 
				});	
				
				n -= 1;
				try { Thread.sleep(1000);}catch(Exception e) {}					
			}
			
			// 结束时最后更新界面
			SwingUtilities.invokeLater ( ()->{
				display.setText("新年快乐");
				okButton.setEnabled(true);
			});			
		}

	}
}

匿名内部类访问局部变量

package my;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

public class MyFrame extends JFrame
{
	JLabel display = new JLabel("准备");
	JButton okButton = new JButton("开始");
	
	public MyFrame(String title)
	{
		super(title);

		// Content Pane
		JPanel root = new JPanel();
		this.setContentPane(root);
		root.setLayout(new BorderLayout());

		root.add(okButton, BorderLayout.PAGE_START);
		root.add(display, BorderLayout.CENTER);
				
		display.setFont(new Font("宋体", Font.PLAIN, 80));
		display.setHorizontalAlignment(SwingConstants.CENTER);
		display.setOpaque(true);
		display.setBackground(Color.WHITE);
		display.setForeground(Color.BLUE);
		
		okButton.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e)
			{				
				onMouseClicked();				
			}			
		});
	}

	// 按钮点击事件处理
	private void onMouseClicked()
	{
		okButton.setEnabled(false); // 禁用按钮
		
		MyWorkThread th = new MyWorkThread();
		th.start();		
	}
	
	private class MyWorkThread extends Thread
	{
		@Override
		public void run()
		{
			int n = 5;
			while(n > 0)
			{
				// 更新界面:显示倒计时				
				final String text = String.valueOf(n);
				
				SwingUtilities.invokeLater ( new Runnable() {					
					@Override
					public void run()
					{							
						// 语法:匿名类可以直接访问外面的final局部变量
						display.setText( text );						
					}
				});	
				
				n -= 1;
				try { Thread.sleep(1000);}catch(Exception e) {}					
			}
		}
	}
	
	private class MyUpdater implements Runnable
	{
		String text;
		
		public MyUpdater(String text)
		{
			this.text = text;
		}

		@Override
		public void run()
		{
			display.setText( text ); 
		}
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值