Aggiorna JLabel ogni X secondi da ArrayList – Java

Ho un semplice programma Java che legge in un file di testo, lo divide per “” (spazi), visualizza la prima parola, aspetta 2 secondi, visualizza il prossimo … ecc … Mi piacerebbe farlo in spring o qualche altra GUI.

Qualche suggerimento su come posso aggiornare facilmente le parole con la spring? Scorri la mia lista e in qualche modo usa setText ();

Non sto avendo fortuna. Sto usando questo metodo per stampare le mie parole nella consol e ho aggiunto JFrame ad esso … Funziona alla grande nella console, ma mette jframe senza fine. Ho trovato la maggior parte online.

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); } } 

Ho una finestra che viene creata con JFrame e JLable, tuttavia, mi piacerebbe che il testo statico fosse dinamico invece di caricare una nuova finestra. Vorrei che lampeggi una parola, scompaia, lampeggia una parola scompare.

Qualche suggerimento su come aggiornare JLabel? Qualcosa con il repaint ()? Sto disegnando uno spazio vuoto.

Grazie!

AGGIORNAMENTO: Con l’aiuto delle persone gentili qui sotto, ho ottenuto di stampare correttamente sulla console. Ecco il mio metodo di stampa:

 private void printWords() { final Timer timer = new Timer(500, null); ActionListener listener = new ActionListener() { private Iterator w = words.iterator(); @Override public void actionPerformsd(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(); } 

Tuttavia, non sta aggiornando l’etichetta? Il mio contructor sembra:

 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..."); } 

Arrivarci … Pubblicherò la correzione una volta che io, o chiunque mi assista, funzionerà. Grazie ancora!

Per prima cosa, crea e visualizza la tua GUI. Una volta visualizzata la GUI, utilizzare un javax.swing.Timer per aggiornare la GUI ogni 500 millis:

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

Non usare mai Thread.sleep(int) all’interno di Swing Code, perché blocca l’EDT; più qui ,

Il risultato dell’utilizzo di Thread.sleep(int) è questo:

inserisci la descrizione dell'immagine qui

Quando Thread.sleep(int) termina

inserisci la descrizione dell'immagine qui

Codice di esempio:

 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 actionPerformsd(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 actionPerformsd(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 actionPerformsd(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); } } 

Ho capito che funziona con questo codice … Spero che possa aiutare qualcun altro a espandere la propria conoscenza di Java. Inoltre, se qualcuno ha qualche consiglio su come pulirlo. Per favore fallo!

Sei sulla strada giusta, ma stai creando il frame all’interno del loop, non all’esterno. Ecco come dovrebbe essere:

 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); } }