2013-06-26 4 views
0

Я пытаюсь создать два потока, каждый из которых работает для своей панели в одном кадре, я имею в виду, что я пытался одновременно менять изображения в одном кадре, но в двух разных панелях одинакового размера в один кадр.многопоточность в одном JFrame

Я сделал это для двух разных фреймов, работающих с собственными изображениями, но я хочу, чтобы это произошло в одном кадре в его собственных панелях.

Мой кодирование было:

import javax.swing.*; 
import org.omg.CORBA.Object; 
import java.awt.*; 

class subviewer1 extends JFrame implements Runnable{ 

    Thread t2 = new Thread(); 

    JFrame f1; 
    //JLabel label; 
    JPanel p1; 
    ImageIcon icon; //= new ImageIcon("C:\\img.png"); 
     JLabel label = new JLabel(icon); 

    int imgPath = 1; 

    public subviewer1(){   
     super(); 
     t2.start(); 
     /* 
     f1 = new JFrame("PIC VIEWER"); 
     f1.setLayout(null); 
     f1.setSize(500,500); 
     f1.setLocation(0,0);   
     p1 = new JPanel();  
     while(true) 
     { 
      try { 
      while (true) {   
       Thread.sleep(1000);     
       p1.setSize(500,500); 
       p1.setLocation(0,0);     
       switch(imgPath) 
       { 
        case 1: 
         //f1.remove(p1); 
         p1.remove(label); 
         p1.setVisible(false); 
         p1.removeAll(); 
         ImageIcon icon = new ImageIcon("C:\\img.png"); 
         JLabel label = new JLabel(icon); 
         p1.add(label); 
         p1.setVisible(true); 
         imgPath = 2; 
         break; 
        case 2: 
         //f1.remove(p1); 
         p1.removeAll(); 
         p1.setVisible(false); 
         ImageIcon icon1 = new ImageIcon("C:\\img1.png"); 
         JLabel label1 = new JLabel(icon1); 
         p1.add(label1); 
         p1.setVisible(true); 
         imgPath = 3; 
         break; 
        case 3: 
         //f1.remove(p1); 
         p1.removeAll(); 
         p1.setVisible(false); 
         ImageIcon icon2 = new ImageIcon("C:\\img2.png"); 
         JLabel label2 = new JLabel(icon2); 
         p1.add(label2); 
         p1.setVisible(true); 
         imgPath = 4; 
         break; 
        case 4: 
         //f1.remove(p1); 
         p1.setVisible(false); 
         p1.removeAll(); 
         ImageIcon icon3 = new ImageIcon("C:\\img3.png"); 
         JLabel label3 = new JLabel(icon3);  
         p1.add(label3); 
         p1.setVisible(true); 
         imgPath = 1; 
         break; 
       }     
       f1.add(p1); 
       f1.setVisible(true); 
       f1.setLayout(null); 
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      } 
      } catch (InterruptedException iex) { 
       System.out.println(iex); 
      } 
     } 
     //initComponents();   
    } 

    @Override 
    public void run() {  
     {   
      f1 = new JFrame("PIC VIEWER"); 
      //f1.setLayout(null); 
      f1.setSize(500,500); 
      f1.setLocation(0,0); 
      p1 = new JPanel();   
      while(true) 
      { 
       try { 
       while (true) {    
        Thread.sleep(1000);     
        p1.setSize(250,500); 
        p1.setLocation(0,0);      
        switch(imgPath) 
        { 
         case 1: 
          //f1.remove(p1); 
          p1.remove(label); 
          p1.setVisible(false); 
          p1.removeAll(); 
          ImageIcon icon = new ImageIcon("C:\\img.png"); 
          JLabel label = new JLabel(icon); 
          p1.add(label); 
          p1.setVisible(true); 
          imgPath = 2; 
          break; 
         case 2: 
          //f1.remove(p1); 
          p1.removeAll(); 
          p1.setVisible(false); 
          ImageIcon icon1 = new ImageIcon("C:\\img1.png"); 
          JLabel label1 = new JLabel(icon1); 
          p1.add(label1); 
          p1.setVisible(true); 
          imgPath = 3; 
          break; 
         case 3: 
          //f1.remove(p1); 
          p1.removeAll(); 
          p1.setVisible(false); 
          ImageIcon icon2 = new ImageIcon("C:\\img2.png"); 
          JLabel label2 = new JLabel(icon2); 
          p1.add(label2); 
          p1.setVisible(true); 
          imgPath = 4; 
          break; 
         case 4: 
          //f1.remove(p1); 
          p1.setVisible(false); 
          p1.removeAll(); 
          ImageIcon icon3 = new ImageIcon("C:\\img3.png"); 
          JLabel label3 = new JLabel(icon3);  
          p1.add(label3); 
          p1.setVisible(true); 
          imgPath = 1; 
          break; 
        }     
        f1.add(p1); 
        f1.setVisible(true); 
        f1.setLayout(null); 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       } 
       } catch (InterruptedException iex) { 
        System.out.println(iex); 
       } 
      }  
     } 
    } 
} 

и

class subviewer2 extends JFrame implements Runnable{ 

    Thread t1 = new Thread(); 
    JFrame f1; 
    //JLabel label; 
    JPanel p2; 
    ImageIcon icon; //= new ImageIcon("C:\\img.png"); 
     JLabel label = new JLabel(icon);  
    int imgPath = 1; 

    public subviewer2(){   
     super(); 
     t1.start(); 
     /* 
     f1 = new JFrame("PIC VIEWER"); 
     f1.setLayout(null); 
     f1.setSize(500,500); 
     f1.setLocation(0,0);   
     p1 = new JPanel(); 

     while(true) 
     { 
      try { 
      while (true) {   
       Thread.sleep(1000);     
       p1.setSize(500,500); 
       p1.setLocation(0,0);     
       switch(imgPath) 
       { 
        case 1: 
         //f1.remove(p1); 
         p1.remove(label); 
         p1.setVisible(false); 
         p1.removeAll(); 
         ImageIcon icon = new ImageIcon("C:\\img4.png"); 
         JLabel label = new JLabel(icon); 
         p1.add(label); 
         p1.setVisible(true); 
         imgPath = 2; 
         break; 
        case 2: 
         //f1.remove(p1); 
         p1.removeAll(); 
         p1.setVisible(false); 
         ImageIcon icon1 = new ImageIcon("C:\\img5.png"); 
         JLabel label1 = new JLabel(icon1); 
         p1.add(label1); 
         p1.setVisible(true); 
         imgPath = 3; 
         break; 
        case 3: 
         //f1.remove(p1); 
         p1.removeAll(); 
         p1.setVisible(false); 
         ImageIcon icon2 = new ImageIcon("C:\\img6.png"); 
         JLabel label2 = new JLabel(icon2); 
         p1.add(label2); 
         p1.setVisible(true); 
         imgPath = 4; 
         break; 
        case 4: 
         //f1.remove(p1); 
         p1.setVisible(false); 
         p1.removeAll(); 
         ImageIcon icon3 = new ImageIcon("C:\\img7.png"); 
         JLabel label3 = new JLabel(icon3);  
         p1.add(label3); 
         p1.setVisible(true); 
         imgPath = 1; 
         break; 
       }     
       f1.add(p1); 
       f1.setVisible(true); 
       f1.setLayout(null); 
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      } 
      } catch (InterruptedException iex) { 
       System.out.println(iex); 
      } 
     } 
     //initComponents();   
    } 

    @Override 
    public void run() {  
     { 

      f1 = new JFrame("PIC VIEWER"); 
     // f1.setLayout(null); 
      f1.setSize(500,500); 
      f1.setLocation(0,0);    
      p2 = new JPanel();   
      while(true) 
      { 
       try { 
       while (true) {    
        Thread.sleep(1000);     
        p2.setSize(350,500); 
        p2.setLocation(250,0);     
        switch(imgPath) 
        { 
         case 1: 
          //f1.remove(p1); 
          p2.remove(label); 
          p2.setVisible(false); 
          p2.removeAll(); 
          ImageIcon icon = new ImageIcon("C:\\img4.png"); 
          JLabel label = new JLabel(icon); 
          p2.add(label); 
          p2.setVisible(true); 
          imgPath = 2; 
          break; 
         case 2: 
          //f1.remove(p1); 
          p2.removeAll(); 
          p2.setVisible(false); 
          ImageIcon icon1 = new ImageIcon("C:\\img5.png"); 
          JLabel label1 = new JLabel(icon1); 
          p2.add(label1); 
          p2.setVisible(true); 
          imgPath = 3; 
          break; 
         case 3: 
          //f1.remove(p1); 
          p2.removeAll(); 
          p2.setVisible(false); 
          ImageIcon icon2 = new ImageIcon("C:\\img6.png"); 
          JLabel label2 = new JLabel(icon2); 
          p2.add(label2); 
          p2.setVisible(true); 
          imgPath = 4; 
          break; 
         case 4: 
          //f1.remove(p1); 
          p2.setVisible(false); 
          p2.removeAll(); 
          ImageIcon icon3 = new ImageIcon("C:\\img7.png"); 
          JLabel label3 = new JLabel(icon3);  
          p2.add(label3); 
          p2.setVisible(true); 
          imgPath = 1; 
          break; 
        }     
        f1.add(p2); 
        f1.setVisible(true); 
        f1.setLayout(null);     
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       } 
       } catch (InterruptedException iex) { 
        System.out.println(iex); 
       }   
      } 

     } 
    } 
} 

public class thdmkr extends Thread{ 

     Thread t1,t2;  
     subviewer1 obj1 = new subviewer1(); 
     subviewer2 obj2 = new subviewer2();  
     public thdmkr(){    
      //super();   
      t1 = new Thread(obj1); 
      t2 = new Thread(obj2); 
      t1.start(); 
      t2.start();   
     } 

    public static void main(String args[]){  
     thdmkr obj = new thdmkr();  
    } 

    public void run(){ 

     } 
} 

это для различных frames..but я хочу сделать это в одном кадре ... поэтому, пожалуйста, исправить мой код или сделать аналогичный код с использованием ***** Thread.sleep (int args); ***** только

+0

1) Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). 2) Пожалуйста, используйте форматирование кода для кода, ввода/вывода и структурированных документов, таких как HTML или XML. Для этого выберите образец и нажмите кнопку '{}' над формой отправки сообщений/редактирования. 3) Пожалуйста, используйте правильное написание слов типа «ты», «твой» и «пожалуйста». Это облегчает людям понимание и помощь. –

ответ

5

Свинг не является потокобезопасным. То есть, вам требуется только доступ, изменение или создание элементов пользовательского интерфейса из одного потока, известного как «Диспетчер событий» (AKA EDT).

Вы должны также никогда не блокировать EDT, используя такие вещи, как sleep, wait или блокирование операций ввода-вывода, например

Хотя существует целый ряд возможных решений проблемы, проще было бы использовать javax.swing.Timer, как это выполняет свои тики в контексте EDT, но не будет блокировать его, пока он ждет.

Посмотрите на Concurrency on Swing для получения более подробной информации

Я также рекомендую просто используя JLabel для отображения значка и вместо того, чтобы добавлять и удалять их, просто установите значок на ссылки нового изображения

+0

thnx помогите сэр! – parminder