单一线程规则,不要在自己的线程中触摸swing组件

前端之家收集整理的这篇文章主要介绍了单一线程规则,不要在自己的线程中触摸swing组件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. class SwingThreadFrame extends JFrame {
  2. public SwingThreadFrame() {
  3. setTitle("Swing Thread");
  4. final JComboBox<Integer> combo = new JComboBox<Integer>();
  5. combo.insertItemAt(Integer.MAX_VALUE,0);
  6. combo.setPrototypeDisplayValue(combo.getItemAt(0));
  7. combo.setSelectedIndex(0);
  8. JPanel panel = new JPanel();
  9. JButton goodButton = new JButton("Good");
  10. goodButton.addActionListener(new ActionListener() {
  11. @Override
  12. public void actionPerformed(ActionEvent event) {
  13. new Thread(new GoodWorkerRunnable(combo)).start();
  14. }
  15. });
  16. panel.add(goodButton);
  17. JButton badButton = new JButton("Bad");
  18. badButton.addActionListener(new ActionListener() {
  19. @Override
  20. public void actionPerformed(ActionEvent event) {
  21. new Thread(new BadWorkerRunnable(combo)).start();
  22. }
  23. });
  24. panel.add(badButton);
  25. panel.add(combo);
  26. add(panel);
  27. pack();
  28. }
  29. }
  1. class GoodWorkerRunnable implements Runnable {
  2. 	public GoodWorkerRunnable(JComboBox<Integer> combo) {
  3. 		this.combo = combo;
  4. 		generator = new Random();
  5. 	}
  6. 	
  7. 	@Override
  8. 	public void run() {
  9. 		try {
  10. 			while(true) {
  11. 				EventQueue.invokeLater(new Runnable() {
  12. 					@Override
  13. 					public void run() {
  14. 						int i = Math.abs(generator.nextInt());
  15. 						if(i % 2 == 0) {
  16. 							combo.insertItemAt(i,0);
  17. 						} else if(combo.getItemCount() > 0) {
  18. 							combo.removeItemAt(i % combo.getItemCount());
  19. 						}
  20. 					}
  21. 				});
  22. 				
  23. 				Thread.sleep(1);
  24. 			}
  25. 		} catch (InterruptedException e) {
  26. 		}
  27. 		
  28. 	}
  29. 	
  30. 	private JComboBox<Integer> combo;
  31. 	private Random generator;
  32. }
    class BadWorkerRunnable implements Runnable {
  33. 	public BadWorkerRunnable(JComboBox<Integer> combo) {
  34. 		this.combo = combo;
  35. 		generator = new Random();
  36. 	}
  37. 	
  38. 	@Override
  39. 	public void run() {
  40. 		try {
  41. 			while(true) {
  42. 				int i = Math.abs(generator.nextInt());
  43. 				if(i % 2 == 0) {
  44. 					combo.insertItemAt(i,0);
  45. 				} else if(combo.getItemCount() > 0) {
  46. 					combo.removeItemAt(i % combo.getItemCount());
  47. 				}
  48. 				
  49. 				Thread.sleep(1);
  50. 			}
  51. 		} catch (InterruptedException e) {
  52. 		}
  53. 		
  54. 	}
  55. 	
  56. 	private JComboBox<Integer> combo;
  57. 	private Random generator;
  58. }
  59.     
  60.         
  61.   

猜你在找的设计模式相关文章