czas w pętli

0

Czy mozna w petli zrobic sterowanie czasowe,tak aby nastepna instrukcja wykonywala sie po uplynieciu np 30 sekund??

0

Tak, np. przy użyciu jednej z klas Timer.

0

Wyskakuja mi bledy przy kompilacji
---------- Capture Output ----------

"C:\Program Files\Java\jdk1.6.0_17\bin\javac.exe" LoadAndShow2.java
LoadAndShow2.java local variable sciezki is accessed from within inner class; needs to be declared final
String path = sciezki[a];
^
LoadAndShow2.java local variable a is accessed from within inner class; needs to be declared final
String path = sciezki[a];
^
LoadAndShow2.java local variable a is accessed from within inner class; needs to be declared final
a++;
^
LoadAndShow2.java local variable f is accessed from within inner class; needs to be declared final
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
^
LoadAndShow2.java local variable f is accessed from within inner class; needs to be declared final
f.add(new JScrollPane(test));
^
LoadAndShow2.java local variable f is accessed from within inner class; needs to be declared final
f.setSize(1229,922);
^
LoadAndShow2.java local variable f is accessed from within inner class; needs to be declared final
f.setLocation(0,0);
^
LoadAndShow2.java local variable f is accessed from within inner class; needs to be declared final
f.setVisible(true);
^
8 errors

Terminated with exit code 1.

Niewiem jak mam z tego wybrnac. Oto kod zrodlowy:

import java.awt.;
import java.awt.image.BufferedImage;
import java.awt.event.
;
import java.io.;
import javax.imageio.ImageIO;
import javax.swing.
;

public class LoadAndShow2 extends JPanel {
BufferedImage image;
Dimension size = new Dimension();

public LoadAndShow2(BufferedImage image) {
    this.image = image;
    size.setSize(image.getWidth(), image.getHeight());
}

/**
 * Drawing an image can allow for more
 * flexibility in processing/editing.
 */
protected void paintComponent(Graphics g) {
    // Center image in this component.
    int x = (getWidth() - size.width)/2;
    int y = (getHeight() - size.height)/2;
    g.drawImage(image, x, y, this);
}

public Dimension getPreferredSize() { return size; }

public static void main(String[] args) throws IOException {
    String[] sciezki;
    sciezki[0]="e://foty/2.jpg";
    sciezki[1]="e://foty/1.jpg";
    int a=0, interval=3000;
    JFrame f = new JFrame(); 
        javax.swing.Timer t;
    ActionListener zdarzenie=new ActionListener(){
	public void actionPerformed(ActionEvent e){
    	String path = sciezki[a];
    	BufferedImage image = ImageIO.read(new File(path));
    	LoadAndShow2 test = new LoadAndShow2(image);
    	a++;       
    	f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	f.add(new JScrollPane(test));
    	f.setSize(1229,922);
    	f.setLocation(0,0);
    	f.setVisible(true);
            //showIcon(image);
	        }
          };
	t=new javax.swing.Timer(interval,zdarzenie);
t.start();
}

/**
 * Easy way to show an image: load it into a JLabel
 * and add the label to a container in your gui.
 */
private static void showIcon(BufferedImage image) {
    ImageIcon icon = new ImageIcon(image);
    JLabel label = new JLabel(icon, JLabel.CENTER);
    JOptionPane.showMessageDialog(null, label, "icon", -1);
}

}

0

declared final String path = sciezki[a];

0

Z tymze zmienna a nie moze byc finalna bo ma sie zmieniac po kazdorazowym wykonaniu zdarzenia
---------- Capture Output ----------

"C:\Program Files\Java\jdk1.6.0_17\bin\javac.exe" LoadAndShow2.java
LoadAndShow2.java cannot assign a value to final variable a
a++;
^
1 error
Terminated with exit code 1.

0

zrobilem podobny programik przy uzyciu jpanel
import java.awt.;
import java.awt.event.
;
import javax.swing.*;

public class Telebim extends JFrame {

public Telebim() {
final String[] sciezki=new String[10];
sciezki[0]="e://foty/2.jpg";
sciezki[1]="e://foty/1.jpg";
int a=0, interval=3000;
setSize(1366,768);
final JPanel panel = new JPanel();
final JLabel label = new JLabel();
javax.swing.Timer t;
ActionListener zdarzenie=new ActionListener(){
public void actionPerformed(ActionEvent e){
ImageIcon icon = new ImageIcon(sciezki[a]);
label.setIcon(icon);
panel.add(label);
this.getContentPane().add(panel);
setVisible(true);
a++;
}
};
t=new javax.swing.Timer(interval,zdarzenie);
t.start();
}
public static void main (String[] args) {

new Telebim(); 

}
}

Ale znowu pojawiaja sie schody
---------- Capture Output ----------

"C:\Program Files\Java\jdk1.6.0_17\bin\javac.exe" Telebim.java
Telebim.java local variable a is accessed from within inner class; needs to be declared final
ImageIcon icon = new ImageIcon(sciezki[a]);
^
Telebim.java cannot find symbol
symbol: method getContentPane()
this.getContentPane().add(panel);
^
Telebim.java local variable a is accessed from within inner class; needs to be declared final
a++;
^
3 errors
Terminated with exit code 1.

0
  1. to a nazwij sobie lepiej jakiś counter i zrób z tego pole klasy!
  2. this.getContentPane().add(panel); Co to jest? Chcesz pobrać panel obiektu reprezentującego ActionListener, to co właśnie zrobiłeś jest klasą anonimową zdarzenia a nie komponentu Swing!
    Z tego co pamiętam odwołujesz się tak: Telebim.this.getContentPane().
  3. W klasie zewn, zrób sobie metodę
    public String getSciezka(int idx){//a tu wiesz co ma już być}

I za pomocą tej metody pobieraj sobie do klasy anonimowej potrzebną ściężkę.
Poza tym po co zmienna a w klasie zewn, zrób sobie pole statyczne w klasie anonimowej i na nim operuj, jeśli tak można bo w sumie nie pamiętam
A jeśli nie można to zrób klasę wewn normalnie nie anonimowo.

4.Czytaj kursy ze strony Suna, a życie będziesz miał łatwiejsze

Pozdrawiam

0

counter?? nie wiem zbytnio o co chodzi, googlowalem ale nie znalazlem nic na ten temat

0

Z tym 'counter', chodziło mi żeby nie dawać zmiennym, które mają jakieś większą rolę niż licznik pętli, g**no znaczących nazw w stylu 'a'. Nie wpadłbym na to, że będziesz za tym googlował...

I jak poradziłeś sobie z tym?

Nie rób zmienny finalnych, zrób z nich pola klasy, klasy zewnętrzne mają do nich dostęp, nawet do składowych prywatnych.
Po co dodajesz label do panelu za każdym razem, dodaj go jeden raz np w konstruktorze, a potem w zmieniaj tylko ikonę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1