[英]How can I implement thread synchronization in word count tool GUI-based project
如何在這段代碼中添加線程同步? 這是一個基於 GUI 的 WordCount 項目
這是我的期末項目,我需要在這個應用程序中應用線程同步的概念:
我已經嘗試了一些方法,但它們都不起作用,請您建議或編寫一些代碼來幫助我實現線程同步概念。
import java.text.NumberFormat;
public class Count_word_character extends javax.swing.JFrame {
NumberFormat nf;
public Count_word_character() {
initComponents();
nf=NumberFormat.getInstance();
nf.setMaximumFractionDigits(0);
nf.setMinimumFractionDigits(0);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
txt = new javax.swing.JTextArea();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jSeparator1 = new javax.swing.JSeparator();
letter = new javax.swing.JLabel();
word = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jLabel1.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
jLabel1.setText("ENTER YOUR TEXT HERE :");
txt.setColumns(20);
txt.setRows(5);
jScrollPane1.setViewportView(txt);
jButton1.setFont(new java.awt.Font("Calibri", 1, 13)); // NOI18N
jButton1.setText("Count");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jButton2.setFont(new java.awt.Font("Calibri", 1, 13)); // NOI18N
jButton2.setText("Clear");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
letter.setFont(new java.awt.Font("Calibri", 1, 12)); // NOI18N
letter.setText("Total Number of Character : ");
word.setFont(new java.awt.Font("Calibri", 1, 12)); // NOI18N
word.setText("Total Number of Word : ");
jLabel2.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
jLabel2.setText("JAVA WORD COUNTER");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
.addContainerGap())
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(jSeparator1)
.addContainerGap())))
.addGroup(layout.createSequentialGroup()
.addGap(55, 55, 55)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(62, 62, 62))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 151, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addGap(55, 55, 55)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(letter, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(word, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addGroup(layout.createSequentialGroup()
.addGap(95, 95, 95)
.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel2)
.addGap(10, 10, 10)
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jButton1)
.addComponent(jButton2))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(27, 27, 27))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(letter)
.addGap(18, 18, 18)))
.addComponent(word)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String s;
s=txt.getText();
char c[]= new char[s.length()];
int i=0,count=0,l=0;
for(i=0;i<s.length();i++){
c[i]=s.charAt(i);
//count Charcters
if(i>0 ||((c[0]!=' ')&&(i==0)))
l++;
//count Words
if(((i>0)&&(c[i]!=' ')&&(c[i-1]==' '))||((c[0]!=' ')&&(i==0))){
count++;
}
}
letter.setText(nf.format(l));
word.setText(nf.format(count));
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
txt.setText(null);
letter.setText(null);
word.setText(null);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Count_word_character.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Count_word_character.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Count_word_character.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Count_word_character.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Count_word_character().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JLabel letter;
private javax.swing.JTextArea txt;
private javax.swing.JLabel word;
// End of variables declaration
}
請不要被侮辱,但是,忘記那些廢話。 只需在 JTextArea 上使用文檔過濾器來處理業務。 要嘗試這一點,我希望您執行以下操作:
將以下代碼行直接放在用於初始化 JTextArea ( txt
) 的代碼行下方,例如:
txt = new javax.swing.JTextArea(); // Apply a Document Filter to JTextArea ((javax.swing.text.AbstractDocument)txt.getDocument()).setDocumentFilter(new CharacterAndWordCountingDocumentFilter());
編輯:我現在看到您更改了提供的代碼,並且您的 JTextArea 組件在類的不可編輯部分中初始化(NetBeans 這樣做是有充分理由的)。 您可以在initComponents();
下的類構造函數中添加該行。 方法調用。
將下面提供的名為CharacterAndWordCountingDocumentFilter的內部類添加到您的Count_word_character類中:
private class CharacterAndWordCountingDocumentFilter extends javax.swing.text.DocumentFilter { String docText = ""; int charCount = 0, wordCount = 0; @Override public void insertString(FilterBypass fb, int offset, String text, javax.swing.text.AttributeSet attr) throws javax.swing.text.BadLocationException { super.insertString(fb, offset, text, attr); } @Override public void replace(FilterBypass fb, int offset, int length, String text, javax.swing.text.AttributeSet attrs) throws javax.swing.text.BadLocationException { super.replace(fb, offset, length, text, attrs); charCount = fb.getDocument().getLength(); letter.setText("<html>Total Number of Characters: <font color = blue>" + charCount + "</font></html>"); docText = fb.getDocument().getText(0, fb.getDocument().getLength()); wordCount = wordCount = getWordCount(docText); word.setText("<html>Total Number of Words: <font color=blue>" + wordCount + "</font></html>"); } @Override public void remove(javax.swing.text.DocumentFilter.FilterBypass fb, int i, int i1) throws javax.swing.text.BadLocationException { super.remove(fb, i, i1); charCount = fb.getDocument().getLength(); letter.setText("<html>Total Number of Characters: <font color = blue>" + charCount + "</font></html>"); docText = fb.getDocument().getText(0, fb.getDocument().getLength()); if (docText.trim().isEmpty()) { wordCount = 0; } else { wordCount = getWordCount(docText); } word.setText("<html>Total Number of Words: <font color=blue>" + wordCount + "</font></html>"); } private int getWordCount(String text) { return text.replaceAll("\\p{Punct}{1,}", " ").split("\\s+").length; } }
現在運行您的應用程序並開始鍵入、刪除、復制/粘貼等,並觀察 JFrame 窗口底部的兩個標簽(字符數和字數)。 我粘貼了包含超過 650 萬個字符的文本,對此沒有任何問題。 你應該會經歷這樣的事情:
如果您喜歡這種東西,那么您可以刪除“計數”按鈕以及與之相關的任何事件和/或概念。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.