我有一個標籤不在GUI的同一實例中更新。 如果我單擊應該更新jLabel(代碼塊中的「testLabel」)的值的jButton,我必須再次運行java程序才能看到所做的更改。我怎樣才能讓它出現在同一個實例中的按鈕點擊? 我知道關於invokelater,我一直在玩它試圖讓它實時更新,但沒有運氣。我一直堅持這一段時間,所以任何幫助表示讚賞。 通過下面列出的代碼塊,我仍然需要運行GUI的新實例來獲取更新的值。標籤不在GUI的相同實例中更新
相關代碼:
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MISControlPanel window = new MISControlPanel();
window.frame.setVisible(true);
// testLabel.setText(CN);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
JButton searchComputerButton = new JButton("Search");
searchComputerButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String line;
BufferedWriter bw = null;
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(tempFile));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// String lineToRemove = "OU=Workstations";
String s = null;
Process p = null;
/*
* try { // p = Runtime.getRuntime().exec(
* "cmd /c start c:\\computerQuery.bat computerName"); } catch
* (IOException e1) { // TODO Auto-generated catch block
* e1.printStackTrace(); }
*/
try {
p = Runtime.getRuntime().exec("c:\\computerQuery.bat");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
StringBuffer sbuffer = new StringBuffer();
BufferedReader in = new BufferedReader(new InputStreamReader(p
.getInputStream()));
try {
while ((line = in.readLine()) != null) {
System.out.println(line);
// textArea.append(line);
String dn = "CN=FDCD111304,OU=Workstations,OU=SIM,OU=Accounts,DC=FL,DC=NET";
LdapName ldapName = new LdapName(dn);
String commonName = (String) ldapName.getRdn(
ldapName.size() - 1).getValue();
}
ComputerQuery.sendParam();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InvalidNameException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally
{
try {
fw.close();
}
catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
try {
in.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
ComputerQuery.sendParam();
}
});
try (BufferedReader br = new BufferedReader(new FileReader(
"resultofbatch.txt"))) {
final Pattern PATTERN = Pattern.compile("CN=([^,]+).*");
try {
while ((sCurrentLine = br.readLine()) != null) {
String[] tokens = PATTERN.split(","); // This will return
// you a array,
// containing the
// string array
// splitted by what
// you write inside
// it.
// should be in your case the split, since they are
// seperated by ","
// System.out.println(sCurrentLine);
CN = sCurrentLine.split("CN=", -1)[1].split(",", -1)[0];
System.out.println(CN);
testLabel.setText(CN);
}
全類代碼 http://pastebin.com/havyqMxP
電腦查詢類(小類) http://pastebin.com/Q89BCjya
您好user6680 ...我不知道您打算執行此操作的執行流程的哪一部分,您正在使用LDAP,我看到..這意味着您正在連接到LDAP服務器,並且可能執行長時間運行的任務... 你是否試圖在組件的任何類型的監聽器(因此在事件調度線程)的回調中執行此操作?或者你正在另一個線程上執行此操作? Swing.invokelater將無助於此...我建議開始閱讀SwingWorker,並在UI上分割表示的操作(處理swing組件的代碼) – Victor
試試這個教程... https://docs.oracle.com/javase/tutorial/uiswing/concurrency /simple.html ... – Victor
我認爲我需要它做的是在不同的線程上運行,以便在GUI的同一實例內更新值。我看着你提供的教程鏈接,但我很困惑。它使用了在done方法中加載圖像的示例,但我不確定如何將其實現到我的代碼中。我一直試圖讓這個工作一個多星期。你有沒有可能向我展示我想要完成的工作示例? – user6680