在多次尝试将主任务与其子任务(线程)同步后,我失败了。我还没有找到任何从swing组件调用的示例。
我创建了一个白色面板,在上面显示一个剪辑电影。这很管用。但是,一旦线程终止,我就想控制主任务。似乎在“setvisible(true)”之后,下一条指令不会执行。我还尝试了一个循环发出睡眠1秒,但没有执行。这是我最后的密码。
/* Auteur: Gérard MARTINELLI */
import gegeutil.Gegetools;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Vector;
import java.util.concurrent.CountDownLatch;
import java.awt.Color;
public class JouerClip extends javax.swing.JDialog
/* Variables et constantes */
public static final long serialVersionUID = 1401213293925293574L;
public static String titre = "",
film = "";
protected Thread th = new Thread();
protected boolean inService = false,
internal = false;
public static Process process = null;
public static String videoplayer = "E:/PotPlayer/PotPlayerMini64.exe";
public static String pathFilm = "F:/Films";
public JouerClip(JFrame owner, String filmName, boolean inter) // constructeur
{
super(owner,true);
if (Gegetools.isEmpty(filmName)) setVisible(false);
film = filmName;
internal = inter;
initialize();
}
public void initialize()
{
setSize(1136, 873);
getContentPane().setLayout(null);
getContentPane().setBackground(Color.WHITE);
setLocationRelativeTo(null);
th = new Thread()
{
public void run()
{
System.out.println("Thread running");
jouer(pathFilm+"/" + film);
System.out.println("Thread stopped");
inService= false;
}
};
inService= true;
th.start();
setVisible(true);
System.out.println("I continue the main task");
try
{
CountDownLatch latch = new CountDownLatch(3);
latch.await(); // Wait for countdown
this.setVisible(false);
if (internal) System.exit(0); else this.setVisible(false);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
public static void jouer( String path)
{
// This works pretty well.
// When the clip ends, the videoplayer has gone.
}
public static void main(String[] agrs)
{
new JouerClip(new JFrame(), "Seven.mp4", true);
}
}
1条答案
按热度按时间cdmah0mi1#
我想我已经解决了我的问题。在jdialog contenpane中,我创建了一个带有actionlistener的jbutton,然后在离开run方法之前,发出一个doclic()。这将执行我想要的(例如返回给调用者)。它工作得很好。