Actualice JLabel cada X segundos desde ArrayList – Java

Tengo un progtwig Java simple que lee en un archivo de texto, lo divide por “” (espacios), muestra la primera palabra, espera 2 segundos, muestra el siguiente … etc … Me gustaría hacer esto en spring o alguna otra GUI.

¿Alguna sugerencia sobre cómo puedo actualizar fácilmente las palabras con la spring? Itera a través de mi lista y de alguna manera usa setText ();

No estoy teniendo suerte. Estoy usando este método para imprimir mis palabras en la consola y agregué el JFrame a él … Funciona muy bien en la consola, pero saca un jframe infinito. Encontré la mayor parte en línea.

private void printWords() { for (int i = 0; i < words.size(); i++) { //How many words? //System.out.print(words.size()); //print each word on a new line... Word w = words.get(i); System.out.println(w.name); //pause between each word. try{ Thread.sleep(500); } catch(InterruptedException e){ e.printStackTrace(); } JFrame frame = new JFrame("Run Text File"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel textLabel = new JLabel(w.name,SwingConstants.CENTER); textLabel.setPreferredSize(new Dimension(300, 100)); frame.getContentPane().add(textLabel, BorderLayout.CENTER); //Display the window. frame.setLocationRelativeTo(null); frame.pack(); frame.setVisible(true); } } 

Tengo una ventana que se crea con JFrame y JLable, sin embargo, me gustaría que el texto estático sea dynamic en lugar de cargar una nueva ventana de spring. Me gustaría que parpadee una palabra, desaparezca, desaparezca una palabra.

¿Alguna sugerencia sobre cómo actualizar JLabel? Algo con repintado ()? Estoy dibujando un espacio en blanco.

¡Gracias!

ACTUALIZACIÓN: con la ayuda de las personas amables a continuación, he conseguido que se imprima correctamente en la consola. Aquí está mi Método de impresión:

 private void printWords() { final Timer timer = new Timer(500, null); ActionListener listener = new ActionListener() { private Iterator w = words.iterator(); @Override public void actionPerformed(ActionEvent e) { if (w.hasNext()) { _textField.setText(w.next().getName()); //Prints to Console just Fine... //System.out.println(w.next().getName()); } else { timer.stop(); } } }; timer.addActionListener(listener); timer.start(); } 

Sin embargo, no está actualizando la etiqueta? Mi contructor se ve así:

 public TimeThis() { _textField = new JTextField(5); _textField.setEditable(false); _textField.setFont(new Font("sansserif", Font.PLAIN, 30)); JPanel content = new JPanel(); content.setLayout(new FlowLayout()); content.add(_textField); this.setContentPane(content); this.setTitle("Swing Timer"); this.pack(); this.setLocationRelativeTo(null); this.setResizable(false); //_textField.setText("loading..."); } 

Cómo llegar … Publicaré el arreglo una vez que yo, o quien me asista, lo haga funcionar. ¡Gracias de nuevo!

Primero, crea y muestra tu GUI. Una vez que se muestre la GUI, use un javax.swing.Timer para actualizar la GUI cada 500 millis:

 final Timer timer = new Timer(500, null); ActionListener listener = new ActionListsner() { private Iterator it = words.iterator(); @Override public void actionPerformed(ActionEvent e) { if (it.hasNext()) { label.setText(it.next().getName()); } else { timer.stop(); } } }; timer.addActionListener(listener); timer.start(); 

Nunca use Thread.sleep(int) dentro de Swing Code, porque bloquea el EDT; más aquí ,

El resultado de usar Thread.sleep(int) es este:

enter image description here

Cuando Thread.sleep(int)

enter image description here

Código de ejemplo:

 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.image.BufferedImage; import java.util.LinkedList; import java.util.Queue; import java.util.Random; import javax.swing.*; //http://stackoverflow.com/questions/7943584/update-jlabel-every-x-seconds-from-arraylistlist-java public class ButtonsIcon extends JFrame implements Runnable { private static final long serialVersionUID = 1L; private Queue iconQueue = new LinkedList(); private JLabel label = new JLabel(); private Random random = new Random(); private JPanel buttonPanel = new JPanel(); private JPanel labelPanel = new JPanel(); private Timer backTtimer; private Timer labelTimer; private JLabel one = new JLabel("one"); private JLabel two = new JLabel("two"); private JLabel three = new JLabel("three"); private final String[] petStrings = {"Bird", "Cat", "Dog", "Rabbit", "Pig", "Fish", "Horse", "Cow", "Bee", "Skunk"}; private boolean runProcess = true; private int index = 1; private int index1 = 1; public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ButtonsIcon t = new ButtonsIcon(); } }); } public ButtonsIcon() { iconQueue.add(UIManager.getIcon("OptionPane.errorIcon")); iconQueue.add(UIManager.getIcon("OptionPane.informationIcon")); iconQueue.add(UIManager.getIcon("OptionPane.warningIcon")); iconQueue.add(UIManager.getIcon("OptionPane.questionIcon")); one.setFont(new Font("Dialog", Font.BOLD, 24)); one.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); two.setFont(new Font("Dialog", Font.BOLD, 24)); two.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); three.setFont(new Font("Dialog", Font.BOLD, 10)); three.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); labelPanel.setLayout(new GridLayout(0, 3, 4, 4)); labelPanel.add(one); labelPanel.add(two); labelPanel.add(three); //labelPanel.setBorder(new LineBorder(Color.black, 1)); labelPanel.setOpaque(false); JButton button0 = createButton(); JButton button1 = createButton(); JButton button2 = createButton(); JButton button3 = createButton(); buttonPanel.setLayout(new GridLayout(0, 4, 4, 4)); buttonPanel.add(button0); buttonPanel.add(button1); buttonPanel.add(button2); buttonPanel.add(button3); //buttonPanel.setBorder(new LineBorder(Color.black, 1)); buttonPanel.setOpaque(false); label.setLayout(new BorderLayout()); label.add(labelPanel, BorderLayout.NORTH); label.add(buttonPanel, BorderLayout.SOUTH); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); label.setPreferredSize(new Dimension(d.width / 3, d.height / 3)); add(label, BorderLayout.CENTER); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); startBackground(); startLabel2(); new Thread(this).start(); printWords(); // generating freeze Swing GUI durring EDT } private JButton createButton() { JButton button = new JButton(); button.setBorderPainted(false); button.setBorder(null); button.setFocusable(false); button.setMargin(new Insets(0, 0, 0, 0)); button.setContentAreaFilled(false); button.setIcon(nextIcon()); button.setRolloverIcon(nextIcon()); button.setPressedIcon(nextIcon()); button.setDisabledIcon(nextIcon()); nextIcon(); return button; } private Icon nextIcon() { Icon icon = iconQueue.peek(); iconQueue.add(iconQueue.remove()); return icon; } // Update background at 4/3 Hz private void startBackground() { backTtimer = new javax.swing.Timer(750, updateBackground()); backTtimer.start(); backTtimer.setRepeats(true); } private Action updateBackground() { return new AbstractAction("Background action") { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { label.setIcon(new ImageIcon(getImage())); } }; } // Update Label two at 2 Hz private void startLabel2() { labelTimer = new javax.swing.Timer(500, updateLabel2()); labelTimer.start(); labelTimer.setRepeats(true); } private Action updateLabel2() { return new AbstractAction("Label action") { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { two.setText(petStrings[index]); index = (index + 1) % petStrings.length; } }; } // Update lable one at 3 Hz @Override public void run() { while (runProcess) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { one.setText(petStrings[index1]); index1 = (index1 + 1) % petStrings.length; } }); try { Thread.sleep(300); } catch (Exception e) { e.printStackTrace(); } } } // Note: blocks EDT private void printWords() { for (int i = 0; i < petStrings.length; i++) { String word = petStrings[i].toString(); System.out.println(word); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } three.setText(word); } three.setText(" Concurency Issues in Swing
" + " never to use Thread.sleep(int)
" + " durring EDT, simple to freeze GUI "); } public BufferedImage getImage() { int w = label.getWidth(); int h = label.getHeight(); GradientPaint gp = new GradientPaint(0f, 0f, new Color( 127 + random.nextInt(128), 127 + random.nextInt(128), 127 + random.nextInt(128)), w, w, new Color(random.nextInt(128), random.nextInt(128), random.nextInt(128))); BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = bi.createGraphics(); g2d.setPaint(gp); g2d.fillRect(0, 0, w, h); g2d.setColor(Color.BLACK); return bi; } }
  import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import javax.swing.*; class TimeThis extends JFrame { private static final long serialVersionUID = 1L; private ArrayList words; private JTextField _textField; // set by timer listener public TimeThis() throws IOException { _textField = new JTextField(5); _textField.setEditable(false); _textField.setFont(new Font("sansserif", Font.PLAIN, 30)); JPanel content = new JPanel(); content.setLayout(new FlowLayout()); content.add(_textField); this.setContentPane(content); this.setTitle("Swing Timer"); this.pack(); this.setLocationRelativeTo(null); this.setResizable(false); _textField.setText("loading..."); readFile(); // read file printWords(); // print results } public void readFile(){ try { BufferedReader in = new BufferedReader(new FileReader("adameve.txt")); words = new ArrayList(); int lineNum = 1; // we read first line in start // delimeters of line in this example only "space" char [] parse = {' '}; String delims = new String(parse); String line = in.readLine(); String [] lineWords = line.split(delims); // split the words and create word object //System.out.println(lineWords.length); for (int i = 0; i < lineWords.length; i++) { Word w = new Word(lineWords[i]); words.add(w); } lineNum++; // pass the next line line = in.readLine(); in.close(); } catch (IOException e) { } } private void printWords() { final Timer timer = new Timer(100, null); ActionListener listener = new ActionListener() { private Iterator w = words.iterator(); @Override public void actionPerformed(ActionEvent e) { if (w.hasNext()) { _textField.setText(w.next().getName()); //Prints to Console just Fine... //System.out.println(w.next().getName()); } else { timer.stop(); } } }; timer.addActionListener(listener); timer.start(); } class Word{ private String name; public Word(String name) { this.name = name; } public String getName() { return name; } } public static void main(String[] args) throws IOException { JFrame ani = new TimeThis(); ani.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ani.setVisible(true); } } 

Lo conseguí trabajando con este código … Espero que pueda ayudar a alguien más a expandir su conocimiento de Java. Además, si alguien tiene alguna recomendación para limpiar esto. ¡Por favor, hazlo!

Estás en el camino correcto, pero estás creando el marco dentro del lazo, no afuera. Esto es lo que debería ser:

 private void printWords() { JFrame frame = new JFrame("Run Text File"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel textLabel = new JLabel("", SwingConstants.CENTER); textLabel.setPreferredSize(new Dimension(300, 100)); frame.getContentPane().add(textLabel, BorderLayout.CENTER); //Display the window. frame.setLocationRelativeTo(null); frame.pack(); frame.setVisible(true); for (int i = 0; i < words.size(); i++) { //How many words? //System.out.print(words.size()); //print each word on a new line... Word w = words.get(i); System.out.println(w.name); //pause between each word. try{ Thread.sleep(500); } catch(InterruptedException e){ e.printStackTrace(); } textLabel.setTest(w.name); } }