我在使用netbeans Swing
GUI的线程方面遇到问题。这是我第一次真正尝试使用Java的文件系统通知程序为备份程序开发GUI。我有两个文件SyncUI.java
和Sync.java
。
我几乎要发生的事情是,在jTextField1
文本字段中输入目录路径,该目录路径将创建一个同步线程,该线程将创建一个新的同步对象,然后processEvents
对该对象进行调用。当该目录中的文件更改时,我想将有关更改的文本添加到列表中。
在当前状态下,UI不再无响应,但是processEvents
并没有在我的列表中添加任何内容。知道是什么问题吗?另外,由于我刚开始使用Java,因此欢迎进行任何建设性的批评。
package sync;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.SwingUtilities;
public class SyncUI extends javax.swing.JFrame {
public SyncUI() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jButton1 = new javax.swing.JButton();
jTextField1 = new javax.swing.JTextField();
list1 = new java.awt.List();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jButton1.setText("Start");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jTextField1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jTextField1ActionPerformed(evt);
}
});
list1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
list1ActionPerformed(evt);
}
});
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(list1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(layout.createSequentialGroup()
.add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 329, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jButton1)
.add(0, 0, Short.MAX_VALUE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(jButton1)
.add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(list1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 229, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(25, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {
jButton1.doClick();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//I tried to use invokeLater, this solved the problem of the UI nonresponse issue
SwingUtilities.invokeLater(new Runnable() {
public void run()
{
//Creates a path dir that my Sync constructor needs to start file notification watcher on that directory
Path dir = Paths.get(jTextField1.getText());
try
{
//Creates a new sync object passing it the directory and the list in my GUI
Sync sync = new Sync(dir, list1);
try
{
sync.processEvents();
}
catch (InterruptedException ex)
{
Logger.getLogger(SyncUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
catch (IOException ex)
{
Logger.getLogger(SyncUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
private void list1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
public static void main(String args[]) throws IOException
{
java.awt.EventQueue.invokeLater(new Runnable()
{
public void run()
{
SyncUI s = new SyncUI();
s.setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JTextField jTextField1;
private java.awt.List list1;
// End of variables declaration
}
package sync;
import static java.nio.file.StandardWatchEventKinds.*;
import java.nio.file.attribute.*;
import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;
public class Sync
{
private final WatchService ws;
private final Map<WatchKey,Path> keys;
public java.awt.List list;
public Sync(Path dir, java.awt.List list) throws IOException, InterruptedException
{
this.ws = FileSystems.getDefault().newWatchService();
this.keys = new HashMap<WatchKey,Path>();
this.list = list;
recSet(dir);
//this.processEvents();
}
private void register(Path dir) throws IOException
{
WatchKey key = dir.register(ws, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
keys.put(key, dir);
}
private void recSet(Path start) throws IOException
{
Files.walkFileTree(start, new SimpleFileVisitor<Path>()
{
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException
{
if(!Files.isHidden(dir))
{
register(dir);
System.out.println(dir);
}
return FileVisitResult.CONTINUE;
}
});
}
void processEvents() throws IOException, InterruptedException
{
System.out.println("Entered processEvents");
SwingUtilities.invokeLater(new Runnable() {
public void run()
{
System.out.println("Entered run");
list.add("test2");
list.repaint();
while(true)
{
WatchKey key;
try
{
key = ws.take();
}
catch (InterruptedException x)
{
return;
}
Path dir = keys.get(key);
if (dir == null)
{
System.err.println("WatchKey not recognized");
continue;
}
for (WatchEvent<?> event: key.pollEvents())
{
WatchEvent.Kind<?> kind = event.kind();
WatchEvent<Path> ev = (WatchEvent<Path>)event;
Path filename = ev.context();
String name = dir.resolve(filename).toString();
if (kind == OVERFLOW)
continue;
if(kind == ENTRY_CREATE)
{
System.out.print("Entry Created: ");
File f = new File(name);
if(f.isDirectory())
try {
register(dir.resolve(filename));
} catch (IOException ex) {
Logger.getLogger(Sync.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(name);
list.add(name);
}
else if(kind == ENTRY_DELETE)
{
System.out.print("Entry Deleted: ");
System.out.println(name);
}
else if(kind == ENTRY_MODIFY)
{
File f = new File(name);
if(!f.isDirectory())
{
System.out.print("Entry Modify: ");
System.out.println(name);
}
}
boolean valid = key.reset();
if (!valid)
break;
}
}
}
});
}
}
Swing不是线程安全的,因此,如果您尝试在同一线程中更新UI,则将出现“应用程序冻结”行为。要解决此问题,您需要将UI更新过程委派给另一个线程。这是使用SwingUtilities.invokeLater(Java
5和更低版本)方法和/或SwingWorker类(自Java 6开始)实现的。
一些链接:
Google搜索:https:
//www.google.com.br/search?q = swing + thread +
safe
我遇到了两个不同的问题一个是一般的Graphics2D,另一个是具体的repaint()方法。 首先是repaint()问题。我有一个基于用户选择的时间间隔更新的图表,时间间隔可以从1秒到几分钟不等。问题是一旦调用了repaint()方法,它就会在代码的每一次迭代中不断地回忆自己,而不仅仅是在我想要的时候。有人知道为什么会这样吗?如何阻止它?我试着把我的代码放在一个带有标志的if语句中,但是一旦标
我正在尝试为AWT Graphics2D实现类似于SWT GC的xor模式绘图。使用内置XORComposite不是一个选项,因为它不像SWT那样实现xor模式绘图。 SWT xor模式绘图通过二进制异或组合源颜色和目标颜色。AWT XORComposite(可通过)使用恒定的xor颜色,该颜色通过二进制异或与源颜色组合,即目标颜色不影响结果颜色。 所以我唯一的选择就是编写我自己的Composit
我一直得到 完整的堆栈跟踪是: 我已经找到了解决方案,找到了一堆。 无法初始化类网络。旧金山。jasperreports。发动机util。JRStyledTextParser 还有大约10个(这是我的第一个问题,所以我不可能把他们都包括在内)。 我试过: 设置 我在代码内做到了: (按预期返回true)。 我将CATALINA_选项设置为。回响如预期。 这没用。 我试了一下。带有DejaVu SA
我目前正在试验java awt机器人,现在我想尝试在我的游戏窗口中按下一些东西。 为了蒸汽。exe时,我设置了以下属性:“与Windows 7的兼容性”、“始终以管理员身份运行”。 然后,我用这个启动了游戏“反击:全球进攻”。bat文件: 游戏启动了,现在我想用下面的代码点击游戏中的一些东西: 鼠标会转到正确的位置,但当它应该点击某个东西时,游戏不会做出反应或识别它。 然而,如果我不把蒸汽。exe
问题内容: Python中的和模块之间有什么区别? 问题答案: 在Python 3中,已重命名为。它是用于实现的基础结构代码,普通的Python代码不应该靠近它。 公开了底层操作系统级别流程的原始视图。这几乎绝不是您想要的,因此在Py3k中重命名以表明它实际上只是实现细节。 添加了一些额外的自动记帐功能,以及一些便捷实用程序,所有这些使它成为标准Python代码的首选。
主要内容:一、MySql中的线程,二、主要方式,三、源码流程,四、总结一、MySql中的线程 在mysql中,每一个连接上来,就会分配给一个相关的THD数据类。在前面的分析中可以看到,连接器(Connectors)连接到的直接就是连接池,在连接池的线程处理中分为三部分,即一对一(一个连接对应一个线程),多对一(多个连接对应一个线程)和线程池(多对多)。 线程池和线程可以针对不同的具体场景来处理具体的事务,这样既兼顾了效率又提高了适应性,对于新手来说,这就是设计的一个
问题内容: 我正在为我的ubuntu服务器(针对我的多客户端匿名聊天程序)实现一种简单的线程池机制,并且需要使我的工作线程进入睡眠状态,直到需要执行一项工作(以函数指针和参数的形式) 。 我当前的系统即将关闭。我(工人线程正在)问经理是否有工作可用,以及是否有5毫秒没有睡眠。如果存在,请将作业添加到工作队列中并运行该函数。糟糕的循环浪费。 什么我 喜欢 做的是做一个简单的事件性的系统。我正在考虑有
问题内容: 看起来我已经搞砸了Java线程/ OS线程和解释性语言。 在开始之前,我确实了解绿色线程是Java线程,其中JVM处理线程,并且整个Java进程仅作为单个OS线程运行。因此,在多处理器系统上是没有用的。 现在我的问题是。我有两个线程A和B。每个线程都有10万行独立代码。我在多处理器系统上的Java程序中运行这些线程。每个线程都将被赋予一个本机OS线程来运行,该线程可以在不同的CPU上运