Медленно печатать текст на JLabel из строки? - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь сделать печать в стиле покемонов внутри JLabel, но из-за его ограничений я не смог сделать это успешно.Я смог выполнить эту задачу для простой печати на консоль, используя следующий код:

for(int i = 0; i < test.length(); i++) {
        System.out.print(test.charAt(i));
        Thread.sleep(35);
    }

Однако, поскольку JLabel не может принять тип данных Char, этот подход не работает.Из-за этого я попытался установить строку для этого символа с помощью этого:

while (pos < text.length() - 1) {
            char test = text.charAt(pos);
            String print = String.valueOf(test);
            label.setText(print);
            try {
                Thread.sleep(35);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            pos++;
        }

Однако затем я столкнулся с вопросом о том, что текст не добавляется к тому, что было в предыдущий раз в цикле.

Есть ли другой способ медленной печати текста?

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Swing НЕ является поточно-ориентированным и ОДНОПРОЧНЫМ.

Вы не можете заблокировать поток диспетчеризации событий, иначе ничего не будет нарисовано, и вы не должны обновлять пользовательский интерфейс или что-либо еще, на что полагается пользовательский интерфейс извне.контекст EDT

Пример запуска

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private String text = "All your base belong to us";
        private int index;

        private JLabel label = new JLabel("");

        public TestPane() {
            setLayout(new GridBagLayout());
            add(label);

            Timer timer = new Timer(35, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent evt) {
                    label.setText(text.substring(0, index));
                    index++;
                    if (index > text.length()) {
                        ((Timer) evt.getSource()).stop();
                    }
                }
            });
            timer.start();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 200);
        }

    }

}
0 голосов
/ 11 февраля 2019

Я быстро щелкнул что-то, что должно напоминать то, что вам нужно:

/**
 *
 * @author Kai
 */
public class Pokemon extends javax.swing.JFrame {

    String text = "someTesttext";
    StringBuffer current = new StringBuffer();

    /**
     * Creates new form Pokemon
     */
    public Pokemon() {
        initComponents();
        new javax.swing.Timer(150, event -> {
            if (current.length() == text.length()) {
                current.setLength(0);
            } else {
                current.append(text.charAt(current.length()));
            }
            this.jLabel1.setText(current.toString());

        }).start();
    }

    /**
     * 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() {

        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMinimumSize(new java.awt.Dimension(400, 400));
        getContentPane().setLayout(null);
        getContentPane().add(jLabel1);
        jLabel1.setBounds(41, 23, 240, 30);

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

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Pokemon().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JLabel jLabel1;
    // End of variables declaration                   
}
0 голосов
/ 11 февраля 2019

Разве вы не можете просто поместить строку вне цикла while и добавить к ней.Как то так:

String print = ""; // add this line
while (pos < text.length() - 1) {
            char test = text.charAt(pos);
            print = print + String.valueOf(test); // add to the print
            label.setText(print);
            try {
                Thread.sleep(35);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            pos++;
        }
...