我读到你不应该.show()在主线程上构建框架以避免死锁,这是一个真正的问题.这应该总是避免吗?此外,一旦您显示任何类型的对话框,例如ProgressMonitorInputStream,即使它已关闭并完成,您仍然必须调用System.exit()以终止应用程序吗?JDialog怎么样?
我为我的项目创建了一个UI,它涉及JLabel(javax.swing),每次完成任务时都需要更新(Label标签)文本.
我使用label.setText来更改/更新里面的文本(如下所示.)但是,大多数情况下,标签不会更改文本.我试图使用label.UpdateUI()希望它能解决问题,但它没有.
taskLabel.setText(msg);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
if (gatherSamplesValue)
{
if (SourceACheckBox)
{
try
{
Thread setLabelText1 = new Thread(){
public void run(){
taskLabel.setText(msg);
taskLabel.validate();
}
};
msg = "Task : Gathering URLs from Phish Tank. DateTime: " + Main.getCurrentDate();
setLabelText1.start();
SourceA.sourceAMain();
msg="Done with the task : " + Main.getCurrentDate();
Thread setLabelText2 = new Thread(){
public void run(){
taskLabel.setText(msg);
taskLabel.validate();
}
};
setLabelText2.start();
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (SourceBCheckBox)
{
.
.
}
if (SourceCCheckBox)
{
. …Run Code Online (Sandbox Code Playgroud) 假设我有一个JTextField"status",我正在运行这段代码:
status = new JTextField(50);
add(status);
for (int i=0; i<10000; i++) {
status.setText("bla bla - "+ i);
System.out.println("bla bla - "+ i);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,现在当循环运行时,JTextField的文本中没有任何事情发生,并且只有当循环结束时,标签是"bla bla - 10000".
我想制作类似于状态栏的内容但不能更新此状态栏"在线".我也尝试在一个线程中进行更新,但结果却相同.
有人可以在迭代或循环时显示我如何在GUI中显示文本吗?
我有一个JFrame进度条和我的代码,它应该在后台运行它显示进度条中的进度.
我在Progressbar类中实现了runnable并启动了线程.但进度条框架没有显示完整..并且它被卡住并且在我的代码完全执行后显示已满,即在主线程关闭后.
我知道这是一个基本错误.
public class ProgressScriptUI extends JFrame implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
setTitle("Progressing to Generate DDL Scripts");
setBounds(400, 250, 850, 400);
getContentPane().setLayout(null);
JProgressBar progressBar= new JProgressBar(0,100);
progressBar.setBounds(200, 100, 500, 20);
add(progressBar);
setVisible(true);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
//I am calling the below code in some other class
ProgressScriptUI progress = new ProgressScriptUI();
Thread uiThread = new Thread(progress);
uiThread.start();
oracleValidateOLDorNEW.execute(); //Code that I need to call in back ground
Run Code Online (Sandbox Code Playgroud) java swing multithreading jprogressbar event-dispatch-thread
我想在一个java小程序中制作一个秒表.问题是..我有一个文本字段说"数字".我接受输入然后当我按下开始按钮时..流程转到下面提到的循环... //我使用NETBEANS!我需要在数字字段中的每1秒文本必须递减1之后...但这不会发生.代码工作正常..但是在时间完成后显示"0"..而不是在循环运行时.
private void startActionPerformed(java.awt.event.ActionEvent evt)
{
int i = Integer.parseInt(number.getText());
number.setText(Integer.toString(i));
while(i!=0)
{
System.out.print(i);
//number.setText(Integer.toString(i));
number.setText("");
try{Thread.sleep(900);}catch(Exception e){e.getMessage();System.out.println(e);}
i--;
}
}
Run Code Online (Sandbox Code Playgroud) 我有这段代码
import javax.swing.SwingUtilities;
public class Client1 {
public static void main( String[] args ) {
SwingUtilities.invokeLater( new Runnable() {
public void run() {
//new MyWindow( "Bayog" );
new MyWindowV2( "Bayog" );
}
} );
}
}
Run Code Online (Sandbox Code Playgroud)
如果我不使用SwingUtilities有什么区别?
我正在编写一个不断ping服务器的程序.我编写代码来检查一次并将ping放入a JLabel并将其放入一个名为的方法中setPing().
这是我的代码
private void formWindowOpened(java.awt.event.WindowEvent evt) {
setPing();
}
Run Code Online (Sandbox Code Playgroud)
这工作但只做了一次,所以我做了:
private void formWindowOpened(java.awt.event.WindowEvent evt) {
for(;;){
setPing();
}
}
Run Code Online (Sandbox Code Playgroud)
但这甚至没有第一次起作用.
我没有把setPing方法,因为它太长了所以这里是:
public String setPing(){
Runtime runtime = Runtime.getRuntime();
try{
Process process = runtime.exec("ping lol.garena.com");
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
int i = 0;
i = line.indexOf("Average");
if(i > 0){
String finalPing = "";
line.toCharArray();
try
{
finalPing = …Run Code Online (Sandbox Code Playgroud) 我正在阅读Thinking in Java,作者强调主要方法不应该调用swing方法.作为这种做法的一个例子,他提出了以下一段代码(可在他的网页上找到):
//: gui/SubmitSwingProgram.java
import javax.swing.*;
import java.util.concurrent.*;
public class SubmitSwingProgram extends JFrame {
JLabel label;
public SubmitSwingProgram() {
super("Hello Swing");
label = new JLabel("A Label");
add(label);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 100);
setVisible(true);
}
static SubmitSwingProgram ssp;
public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(new Runnable() {
public void run() { ssp = new SubmitSwingProgram(); }
});
TimeUnit.SECONDS.sleep(1);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ssp.label.setText("Hey! This is Different!");
}
});
}
} ///:~
Run Code Online (Sandbox Code Playgroud)
然后通过invokeLater方法创建并初始化gui对象,使其成为线程安全的.但是几页之后,作者提出了以下代码:
//: gui/Button2.java
// Responding to …Run Code Online (Sandbox Code Playgroud) java swing multithreading thread-safety event-dispatch-thread
好的,所以我们的任务是创建一个猜测游戏,用户输入一个数字,文本前景应该变为红色,如果它太高,蓝色,如果它太低,或绿色,如果它是准确的.
我们的老师发布了代码,这很简单,我可以理解它.问题是,当我尝试重新格式化我需要的东西时,我得到了JFrame,我得到了我可以输入的文本字段,但是当我点击提交它就像冻结一样.我想它与动作监听器的编写方式有关,但我不确定.
任何帮助将是欣赏.
这是我的代码,编辑所以只显示特定部分"
button.addActionListener(
new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0)
{
userInput = keyboard.next();
if(Integer.parseInt(userInput) > randomNumber)
{
tf.setForeground(Color.red);;
}
else if(Integer.parseInt(userInput) < randomNumber)
{
tf.setForeground(Color.blue);
}
else if(Integer.parseInt(userInput) == randomNumber)
{
tf.setForeground(Color.green);
}
}
}
);
}
Run Code Online (Sandbox Code Playgroud) 我一直在阅读关于Swing中的Java Concurrency,并且无法找到适合我情况的答案.
目标:让我的swing应用程序同时运行while循环,直到程序/应用程序退出.
问题:程序冻结(正如我之前预期的那样)并且无法使用.
尝试 - 解决方案:我试图在另一个线程上启动while循环,启动它,仍然没有.
码:
package stakeme;
import java.io.IOException;
import javax.swing.SwingUtilities;
public class StakeMeServer {
private static ServerSocket socket;
public static Thread t;
public static void main(String[] args) throws IOException {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ConsoleGUI("Server", 800, 400, false);
}
});
Thread t = new Thread(() -> {
System.out.println("1");
while (online) {
System.out.println("2");
}
});
t.setName("GameServer");
t.start();
}
}
Run Code Online (Sandbox Code Playgroud)
更新:通过使用SwingWorker类在后台执行我的while循环,我几乎可以做我需要做的事情.
码:
package stakeme;
import java.io.IOException;
import …Run Code Online (Sandbox Code Playgroud) java ×10
swing ×9
awt ×2
concurrency ×2
jlabel ×2
jtextfield ×2
applet ×1
invokelater ×1
jframe ×1
jprogressbar ×1
ping ×1
sleep ×1
swingworker ×1