Wątek przeniesiony 2014-05-30 17:40 z Java przez bogdans.

Prawidłowe odświeżanie elementów

0

Witam. Jestem dość początkującym jeśli chodzi o jave. Piszę pewien programik i mam mały problem z odświeżaniem się elementów graficznych w oknie. Wszystko zaczyna działać poprawnie jeśli przejdę po całej tablicy zdjęć, machnę oknem za granice widoczności pulpitu i dopiero działa jak powinno. Stosuję metodę repaint() po każdej zmianie w oknie lecz zapewne ma ona jakieś ograniczenia lub po prostu źle z niej korzystam tak czy siak proszę o jakąś wskazówkę.

 
public class PhotoViewer extends JFrame implements MouseListener{
	private static final long serialVersionUID = 1L;
	private ImagePaint buttonNext,buttonBack,imageTableFull[];
	private String imageName[];
	private int size = 0,currentImage = 0;

	public PhotoViewer(){
	setTitle("Photo Viewer");
        setSize(806,528);
        setLocationRelativeTo(null);
        setResizable(false);
        setLayout(null);
        new SystemLook();
        
        try{
		BufferedImage image = ImageIO.read(new File("bin/next.png"));
		buttonNext = new ImagePaint(image,64,64);
		buttonNext.setBounds(730,5,64,64);
	        add(buttonNext);
	        buttonNext.addMouseListener(this);
	        
	        image = ImageIO.read(new File("bin/back.png"));
	        buttonBack = new ImagePaint(image,64,64);
	        buttonBack.setBounds(5,5,64,64);
	        add(buttonBack);
	        buttonBack.addMouseListener(this);
	} catch (IOException ioe) {
		System.out.println(ioe);
	}
        
        imageTableFull = new ImagePaint[100];
        imageName = new String[100];
	}
	
	public void getTable(ImagePaint ip,String name){ //zapisuje do tablicy obrazki
		imageTableFull[size] = ip;
		imageName[size++] = name;
	}
	
	public void setClean(){ //czysci okno, tabele obrazkow i tabele nazw, resetuje rozmiar aktualnego katalogu
		remove(imageTableFull[currentImage]);
		for(int i = 0;i < imageTableFull.length;i++){
			imageTableFull[i] = null;
			imageName[i] = "";
		}
		size = 0;
	}
	
	public void showImage(int a){
		this.currentImage = a;
		
		for(int i = 0;i < size;i++){
			remove(imageTableFull[i]);
		}

		imageTableFull[a].setBounds(0,0,800,500);
        	add(imageTableFull[a]);
        
		setTitle("Photo Viewer"+ " - " +imageName[a]);
        
        	repaint();
	}

	public void mouseClicked(MouseEvent mc) {}
	public void mouseEntered(MouseEvent mc) {}
	public void mouseExited(MouseEvent mc) {}
	public void mousePressed(MouseEvent mc) {}

	@Override
	public void mouseReleased(MouseEvent mc) {
		Object zrodlo = mc.getSource();
		if(zrodlo == buttonNext){
			if(currentImage+1 < size) showImage(++currentImage);
			else JOptionPane.showMessageDialog(null,"Koniec galerii","Informacja",JOptionPane.INFORMATION_MESSAGE);
		}
		else if(zrodlo == buttonBack){
			if(currentImage > 0) showImage(--currentImage);
			else JOptionPane.showMessageDialog(null,"Koniec galerii","Informacja",JOptionPane.INFORMATION_MESSAGE);
		}
	}
}
0

A gdzie metoda paintComponent?
Umieszczaj kod w znacznikach <code class="java"> </code>

0

Proszę:

public class ImagePaint extends JPanel {
	private static final long serialVersionUID = 1L;
	private Image scaleImage;
	    
    public ImagePaint(BufferedImage image,int imgW,int imgH) {
    	scaleImage = image.getScaledInstance(imgW, imgH, java.awt.Image.SCALE_DEFAULT);
    }
     
    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
	g2d.drawImage(scaleImage, 0, 0, this);
    }
}

Dodam może, że wcześniej zapisuję obrazki w taki sposób:

tmpFileName = br.readLine();  sciezka pliku
file = new File(tmpFileName); otwieranie pliku
image = ImageIO.read(file); tworzenie obrazu
imageTableFull[i] = new ImagePaint(image,800,500); zapis obrazu do tabeli
0

Uzupełniłem Twój kod o metodę main, zakomentowałem wiersz new SystemLook();, wczytałem do tablicy *imageTableFull kilka obrazków, ustawiłem wartości pól size i *currentImage// (na -1) i działa poprawnie. Jeśli masz błąd, to w tym kodzie, którego nie zamieściłeś.

0

Działa Ci poprawnie odświeżanie po naciśnięciu strzałki na następny obrazek? U mnie po naciśnięciu znikają strzałki i jest widoczny tylko obraz. Dopiero po machnięciu oknem pojawiają się strzałki. Na pewno jest to coś z tego kodu, który zamieściłem. Jeśli chcesz mogę Ci podesłać na pm, cały projekt w Eclipse. Podesłałbym jako *.jar, ale coś client.jar nie chce działać jak należy.

0

Podeślij, adres wysłałem w mailu. Client.jar może nie działać z powodu błędnych adresów plików graficznych. Przy uruchamianiu w Eclipsie jest inny katalog bieżący.

0

Racja, zamiast wrzucić obrazki do bin, wrzuciłem do folderu przed bin gdzie znajdowały się jary. Spakowaną paczkę wysłałem mail'em.

0

Zapomniałem napisać, że problem rozwiązany. Java po prostu nie lubi nałożonych na siebie elementów i odświeża je losowo. Temat można zamknąć.

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