在jlabel中生成打字机效果

yuvru6vn  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(483)

这是我的jpanel,我在jframe中添加了它,但是每一个字母写一个字母的代码,但是当执行的时候冻结了,稍后,文本出现了,文本没有这样的效果,但是我认为它应该可以工作,为什么?

  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. package vista;
  7. import java.awt.Image;
  8. import javax.swing.ImageIcon;
  9. import static paladins.nut.and.crush.panelver.PaladinsNutAndCrushPanelVer.mainPanel;
  10. public class sceneKonami extends javax.swing.JPanel {
  11. String ruta = "src/backgrounds/soniabelmont.png";
  12. String ruta1 = "src/backgrounds/legends.png";
  13. ImageIcon fondo = new ImageIcon(new ImageIcon(ruta).getImage().getScaledInstance(1280, 720, Image.SCALE_DEFAULT));
  14. ImageIcon fondo1 = new ImageIcon(new ImageIcon(ruta1).getImage().getScaledInstance(730, 250, Image.SCALE_DEFAULT));
  15. public sceneKonami() {
  16. initComponents();
  17. loader();
  18. }
  19. /**
  20. * This method is called from within the constructor to initialize the form.
  21. * WARNING: Do NOT modify this code. The content of this method is always
  22. * regenerated by the Form Editor.
  23. */
  24. @SuppressWarnings("unchecked")
  25. // <editor-fold defaultstate="collapsed" desc="Generated Code">
  26. private void initComponents() {
  27. jButton1 = new javax.swing.JButton();
  28. texter = new javax.swing.JLabel();
  29. castlevania = new javax.swing.JLabel();
  30. background = new javax.swing.JLabel();
  31. setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
  32. jButton1.setText("jButton1");
  33. jButton1.addActionListener(new java.awt.event.ActionListener() {
  34. public void actionPerformed(java.awt.event.ActionEvent evt) {
  35. jButton1ActionPerformed(evt);
  36. }
  37. });
  38. add(jButton1, new org.netbeans.lib.awtextra.AbsoluteConstraints(240, 370, -1, -1));
  39. add(texter, new org.netbeans.lib.awtextra.AbsoluteConstraints(184, 77, 1050, 510));
  40. add(castlevania, new org.netbeans.lib.awtextra.AbsoluteConstraints(50, 30, 730, 250));
  41. add(background, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 1280, 720));
  42. }// </editor-fold>
  43. private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
  44. String message = "Sonia Belmont is waiting, \nShe will appear soon. \nIn a great adventure";
  45. slowPrint(message);
  46. }
  47. public static void slowPrint(String message) {
  48. char[] chars = message.toCharArray();
  49. for (int i = 0; i < chars.length; i++) {
  50. texter.setText(texter.getText() + String.valueOf(message.charAt(i)));
  51. mainPanel.repaint();
  52. mainPanel.revalidate();
  53. System.out.println(message.charAt(i));
  54. try {
  55. Thread.sleep(100);
  56. } catch (InterruptedException e) {
  57. e.printStackTrace();
  58. }
  59. }
  60. }
  61. // Variables declaration - do not modify
  62. private javax.swing.JLabel background;
  63. private javax.swing.JLabel castlevania;
  64. private javax.swing.JButton jButton1;
  65. private static javax.swing.JLabel texter;
  66. // End of variables declaration
  67. private void loader() {
  68. background.setIcon(fondo);
  69. castlevania.setIcon(fondo1);
  70. }
  71. }

当程序运行时,我按下按钮运行类型writer eefect,程序被冻结,稍后文本出现

9ceoxa92

9ceoxa921#

以下是您使用swing尝试实现的mre(1) Timer :

  1. import java.awt.BorderLayout;
  2. import java.awt.Dimension;
  3. import java.awt.event.ActionEvent;
  4. import javax.swing.AbstractAction;
  5. import javax.swing.JFrame;
  6. public class SwingMain {
  7. SwingMain() {
  8. JFrame frame = new JFrame();
  9. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  10. frame.setLocationRelativeTo(null);
  11. frame.add(new SceneKonami());
  12. frame.pack();
  13. frame.setVisible(true);
  14. }
  15. public static void main(String[] args) {
  16. new SwingMain();
  17. }
  18. }
  19. class SceneKonami extends javax.swing.JPanel {
  20. private int index = 0;
  21. private javax.swing.Timer timer;
  22. private javax.swing.JButton jButton1;
  23. private javax.swing.JLabel texter;
  24. public SceneKonami() {
  25. initComponents();
  26. }
  27. private void initComponents() {
  28. jButton1 = new javax.swing.JButton();
  29. texter = new javax.swing.JLabel();
  30. setLayout(new BorderLayout(5,5));
  31. jButton1.setText("Type Message");
  32. jButton1.addActionListener(evt -> jButton1ActionPerformed(evt));
  33. add(jButton1, BorderLayout.SOUTH);
  34. add(texter, BorderLayout.NORTH);
  35. setPreferredSize(new Dimension(400,150));
  36. }
  37. private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
  38. String message = "Sonia Belmont is waiting, \nShe will appear soon. \nIn a great adventure";
  39. slowPrint(message);
  40. }
  41. public void slowPrint(String message) {
  42. if(timer != null && timer.isRunning()) return;
  43. index = 0;
  44. texter.setText("");
  45. timer = new javax.swing.Timer(100,new AbstractAction() {
  46. @Override
  47. public void actionPerformed(ActionEvent e) {
  48. texter.setText(texter.getText() + String.valueOf(message.charAt(index)));
  49. index++;
  50. if (index >= message.length()) {
  51. timer.stop();
  52. }
  53. }
  54. });
  55. timer.start();
  56. }
  57. }

(1) 在询问和回答时,始终考虑发布mre。

展开查看全部

相关问题