Viết chương trình chạy chữ từ phải sang trái hoặc từ trái sang phải (sử dụng GUI)

Viết chương trình chạy như hình dưới. Người dùng chọn “To Left” thì chữ trượt sang trái, chọn “To Right” sẽ trượt sang phải, chọn “Stop” thì dừng.
image

Dưới đây là code của em. jButton1, JButton2, JButton3 tương ứng là “To Left”, “Stop”, “To Right”.
Em chạy chương trình thì gặp lỗi: call ToLeft -> call Stop -> call ToRight -> call Stop -> call ToLeft -> call Stop -> call ToRight. đến call ToRight thì báo lỗi, chuơng trìnhk chạy được nữa
Ai chỉ giúp em với ạ. Em cám ơn!

package Bai2;

import static java.lang.Thread.sleep;

public class Bai2TT extends javax.swing.JFrame {

    /**
     * Creates new form Bai2TT
     */
    private boolean flag;
    private Running t;
    private Running1 t1;
    public Bai2TT() {
        initComponents();        
        flag=false;
        t=new Running();
        t1 = new Running1();
    }
    class Running extends Thread{
        
        public void run(){
            
            String line=jLabel1.getText();
            while(true){
                line=line.charAt(line.length()-1)+line.substring(0,line.length()-1);
                jLabel1.setText(line);
                try{
                    sleep(200);
                }catch(InterruptedException e){
                    System.out.println(e);
                }
            }
        }
    }
    class Running1 extends Thread{
        
        public void run(){
            
            String line=jLabel1.getText();
            while(true){
                line=line.substring(1,line.length()) + line.charAt(0);
                jLabel1.setText(line);
                try{
                    sleep(200);
                }catch(InterruptedException e){
                    System.out.println(e);
                }
            }
        }
    }
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("To Left");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("Stop");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jButton3.setText("To Righ");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });

        jLabel1.setFont(new java.awt.Font("Lucida Grande", 0, 18)); // NOI18N
        jLabel1.setText("Post and Telecommunication Institue Technology");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(77, 77, 77)
                .addComponent(jButton1)
                .addGap(57, 57, 57)
                .addComponent(jButton2)
                .addGap(42, 42, 42)
                .addComponent(jButton3)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(71, Short.MAX_VALUE)
                .addComponent(jLabel1)
                .addGap(73, 73, 73))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(30, 30, 30)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 64, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(82, 82, 82)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2)
                    .addComponent(jButton3))
                .addContainerGap(95, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        if(!flag){
            t.start();
            flag=true;
        }else
            t.resume();
    }                                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
       t.suspend();
       t1.suspend();
    }                                        

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        t1.start();
    }                                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        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(Bai2TT.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Bai2TT.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Bai2TT.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Bai2TT.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 Bai2TT().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel jLabel1;
    // End of variables declaration                   
}

EDIT (@library): @giang3 nhớ sử dụng Markdown để format code trong các post khác nhé!
Ngoài ra, cậu nên bổ sung thông tin lỗi mà cậu gặp vào trong post này. Nó sẽ giúp mọi người hiểu vấn đề, và cậu có câu trả lời nhanh hơn.

Once started, a Thread may not be restarted

Theo luồng thì lần đầu bạn call ToLeft là đã gọi start(), sau đó bạn stop() và gọi start() lại nên lỗi

2 Likes

em xin cách fix với ạ

  1. Tạo mới hoàn toàn luồng.
  2. Cho 1 luồng chạy không dừng và vài biến cờ hiệu chỉ định việc chạy hay dừng. Luồng đóng khi Frame đóng.
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?