簡體   English   中英

如何在基於 GUI 的字數統計工具項目中實現線程同步

[英]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 上使用文檔過濾器來處理業務。 要嘗試這一點,我希望您執行以下操作:

  1. 將以下代碼行直接放在用於初始化 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();下的類構造函數中添加該行。 方法調用。

  2. 將下面提供的名為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM