Przesuwający się napis Swing

0

Witam
Mam dosyć prosty prosty problemik mianowicie chciałbym aby napis przesuwał się po ekranie tak aby to było widoczne, obecnie przesunięcie jest natychmiastowe :)
Jedynym moim pomysłem jest użycie wątków ale chciałbym się was poradzić czy jest jakiś inny prostszy sposób ?

 import java.awt.Graphics;

import javax.swing.JPanel;


public class Grafika extends JPanel {
int x=100,y=100;

	public void move(){
			for(int i = 0;i<300;i++){
			x=+i;
			y=+i; 
		repaint();
		
		}	
	}
	
	
	public void paint(Graphics g){
		super.paint(g);
		g.drawString("lol",x, y);
		move();
	}
	
	
}
0

Bez sensu to zrobiłeś.

  1. Wątki muszą być go inaczej zablokujesz sobie wątek GUI i efekt będzie żaden albo natychmiastowy.
  2. Samo przesuwanie musisz wykonywać w osobnym wątku i robić Thread.sleep() na chwile żeby widzieć przesuwanie.
0

niby poprawiłem ale mimo to blokuje mi się w pewnym momencie i nie bardzo mam pomysł czemu.

 import java.awt.Graphics;

import javax.swing.JPanel;


public class Grafika extends JPanel {
int x=100,y=100;
private Thread thread = new Thread (new Runnable() {
	

	public void run() {
			for(int i = 0;i<500;i=i+50){
			
			x=+i;
			y=+i; 
			
			
			try {
				thread.sleep(1000);
				repaint();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			}
		
	}
}); 

	public void move(){
		thread.start();
		
	}
	
	
	public void paint(Graphics g){
		super.paint(g);
		g.drawString("lol",x, y);
		move();
	}
	
	
}
1

WTF? Wołasz repaint() z poziomu paint(). Wołasz thread.start() co chwila.
Myśl co robisz! Z poziomu paint() nie wołaj move(), a wątek wystartuj w jakimś innym miejscu.

0

tak już poprawiłem ten błąd :-) temat do zamknięcia.
Zamieszczam rozwiązanie :

 import java.awt.Graphics;

import javax.swing.JPanel;


public class Grafika extends JPanel {
int x=100,y=100;
private Thread thread = new Thread (new Runnable() {
	

	public void run() {
			for(int i = 0;i<500;i++){			
			x=+i;
		
			repaint();
			try {
				thread.sleep(10);
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			}
		
	}
}); 

	public void move(){
		thread.start();
		
	}
	public void paint(Graphics g){
		super.paint(g);
		g.drawString("lol",x, y);
		
	}
	
	
}
0

jest jakiś sposób by określić jak szeroki i wysoki jest napis ?
Chciałbym by tekst po dotarciu do prawej krawędzi zaczynał poruszać się w druga stronę, i tak w kółko.

1

Zrobiłbym to inaczej -> przesuwałbym JLabel z tekstem a nie robił darwString

1

Można określić rozmiar napisu w pikselach. Służy do tego klasa FontMetrics.

0

zastosowałem label, ale chcę aby szerokość label`a była ustalana na podstawie długości słowa.
niestety nie działa taka składnia :

String      message = new String("Hello");
		Font        defaultFont = new Font("Helvetica", Font.PLAIN, 12);
		FontMetrics fontMetrics = new FontMetrics(defaultFont) {
		} ;
	
		
		k = fontMetrics.stringWidth(message);
		System.out.print(k); 

Program się kompiluje ale podczas uruchomienia wyrzucane są błędy.
Na przykładach które znalazłem na internecie jest zapisane

FontMetrics fontMetrics = new FontMetrics(defaultFont);

Ale w takiej postaci nie przyjmuje mi Eclipse :/

0
ice25 napisał(a):

zastosowałem label, ale chcę aby szerokość label`a była ustalana na podstawie długości słowa.
niestety nie działa taka składnia :

String      message = new String("Hello");
		Font        defaultFont = new Font("Helvetica", Font.PLAIN, 12);
		FontMetrics fontMetrics = new FontMetrics(defaultFont) {
		} ;
	
		
		k = fontMetrics.stringWidth(message);
		System.out.print(k); 

Program się kompiluje ale podczas uruchomienia wyrzucane są błędy.
Na przykładach które znalazłem na internecie jest zapisane

FontMetrics fontMetrics = new FontMetrics(defaultFont);

Ale w takiej postaci nie przyjmuje mi Eclipse :/

chyba oczywiste bo FontMetric jest abstraktem

0

czyli czego mi brakuje w tym kodzie by mi liczył szerokość w pikselach ?

0
        String message = new String("Hello");
        Font defaultFont = new Font("Helvetica", Font.PLAIN, 12);
        JLabel prototyp = new JLabel("To niestety jest skomplikowane");
        prototyp.setFont(defaultFont);
        FontMetrics fontMetrics = prototyp.getFontMetrics(defaultFont);
        int k = fontMetrics.stringWidth(message);
        System.out.print(k); // => 29
0

Napotkałem teraz dziwny błąd, mianowicie przesuwający label "ucieka mi" za ramkę. (screen w załączniku)

Ramka ramka = new Ramka();
		int tmp = ramka.panel.x; /// położenie początkowe tekstu, w naszym przypadku 0

		public Thread odpal = new Thread(new Runnable() {
			public void run() {
				int dł_tekstu = lenght_String(ramka.panel.tekst) ; /// długosc tekstu
				int szer_ramka = ramka.getWidth();				/// szerokosc ramki
				while(true){
					if ((tmp < szer_ramka - dł_tekstu) && (tmp >=0)){			
						tmp = tmp + 1; 
						ramka.panel.initializePanel(tmp,dł_tekstu);		///tworzy nowy label
					} 

w moim przypadku :
ramka.panel.x = 0
dł_tekstu = 34
szer_ramka = 700
tmp = 666 - gdy kończy swoje działanie

Czy potrafi mi ktoś odpowiedzieć czemu tak się dzieje ?

0

Zapewne coś spieprzyłeś w funkcji initializePanel. Nie wiem po co ją wywołujesz i tworzysz nowy label. Masz przykład napisu wędrującego tam i z powrotem.

//pola 
int zwrot = 1;
boolean firstTime = true;
    public void run()
    {
        while(true)
        {
            repaint();
            try
            {
                if(x + widthOfLabel == szer_ramka)
                {
                    zwrot = -zwrot;
                    firstTime = false;
                }
                if(x == 0 && !firstTime)
                {
                    zwrot = -zwrot;
                }
                x+=zwrot;
                label.setBounds(x,50,widthOfLabel,20);
                Thread.sleep(10);
            }
            catch(Exception e)
            {
            }
        }
    }

Warto by zmienna widthOfLabel była trochę większa (o 1 piksel) niż długość napisu.

0

wydaje mi sie że nie ma błędu w tym :

public void initializePanel(int x, int width_lbl){
		
		lbl.setBounds(x, 50, width_lbl, 50);
		add(lbl);
	} 

Wpisałem twój kod i dzieje się tak samo, napis i tak wychodzi delikatnie poza ramkę :/

1

A czym u Ciebie jest szer_ramki (700)? Szerokością całego okna JFrame czy szerokością panelu? Powinno być szerokością panelu, te dwie szerokości różnią się o kilka pikseli (u mnie o 8).
Kod metody initializePanel jest bardzo dziwny. Dlaczego w nim jest wywołanie

add(lbl)

lbl powinien być dodany tylko raz.

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