Przerysowywanie

0

Witam serdecznie mam maly problem z przerysowaniem obiektu przy wcisnietym przycisku... gdy ma byc narysowany podczas przycisniecia jest ok... ale zeby zmienial kolor w czasie trzymania przycisku jest juz problem...

protected void paintComponent(Graphics g){
		super.paintComponent(g);
		if(wlaczony==false){
			g.setColor(Color.WHITE);
			g.drawRect(40, 40, 20, 20);
		}else{
			g.setColor(Color.BLUE);
			g.drawRect(40, 40, 20, 20);
		}
		
	}
	
	public void wlacz(){
		wlaczony = true;
	}
	
	public void wylacz(){
		wlaczony = false;
	}

//obsluga przycisku


				if(e.getKeyCode()==KeyEvent.VK_RIGHT){
				  objekt.wlacz();
                                   repaint();
                               }//tu sie zaczynaja schodki bo probowalem w petli wywolywal wlacz/wylacz ale to //nic nie daje

dziekuje za podpowiedz pozdrawiam

0

Najpierw musisz odczytywać stan przycisku - a konkretnie to czy jest w stanie przyciśniętym czy nie. Jeżeli nie jesteś w stanie tego sprawdzić bezpośrednio, to musisz obsłużyć listenerem zdarzenia wciśnięcia i puszczenia potrzebnego klawisza oraz odpowiednio zmieniać stan zmiennej określającej jego stan przyciśnięcia. U Ciebie może to być zmienna wlaczony. Nie wystarczy jednak odczytywanie jaki klawisz wygenerował zdarzenie, ale trzeba też określić jakie to zdarzenie.

Zakładam, że to co opisałeś jako "//obsluga przycisku" to tylko fragment metody obsługi zdarzenia keyTyped() lub keyPressed(). Potrzeba więc, żeby były np.:

@Override public void keyPressed(KeyEvent e)
{
     if(e.getKeyCode()==KeyEvent.VK_RIGHT)
     {
		wlaczony = true;
		repaint();
//		button.getModel().setArmed(true);
//		button.getModel().setPressed(true);
//		button.paintImmediately(0, 0, button.getWidth(), button.getHeight());
     }
}

@Override public void keyReleased(KeyEvent e)
{
     if(e.getKeyCode()==KeyEvent.VK_RIGHT)
     {
		wlaczony = false;
		repaint();
//		button.getModel().setPressed(false);
//		button.getModel().setArmed(false);
//		button.paintImmediately(0, 0, button.getWidth(), button.getHeight());
     }
}

Wykomentowane masz alternatywne podejście, które przydaje się kiedy z klawiszem masz związanego jakiegoś konkretnego buttona. Wtedy naciskanie klawisza jest odwzorowywane wciśnięciem i puszczaniem tego przycisku. Oczywiście zamiast button można wstawić this (do paintImmediately()) i/lub to samo do wywołań getModel() jeżeli sam obiekt dziedziczy już po JButton.

ps. W przypadku buttone ewentualnie przydałoby się interaktywne wciskanie i puszczanie myszą takiego buttona, co można osiągnąć za pomocą rejestracji ChangeListenera na button.getModel().addChangeListener(ChangeListener e) i podania mu procedury obsługi np.coś w tym stylu:

void stateChanged(ChangeEvent e)
{
     wlaczony = button.getModel().isPressed();
}

Wtedy miałbyś pełną kontrolę nad klawiszem i jakimś przyciskiem ekranowym jednocześnie. Byłyby one ze sobą ściśle powiązane (tak jak np. w jakiejś grze).

0

a jezeli nie mam zwiazanego z nim zadnego buttona?? bo ogolnie mecze sie z tym zeby moj obiekt sobie "migal" no dziwnie to zabrzmialo... zeby zmienial kolor podczas wcisnietego przycisku :)

0

Użyj timera (javax.swing.Timer), naciśnięcie przycisku uruchamia timer, puszczenie przycisku zatrzymuje.

0

ale do czego timer mi tu posluzy?? bo nie za bardzo kumam... nacisne przycisk timer poleci do przodu (a rysunek ??)...puszcze przycisk timer sie zatrzyma

0

Timer poleci i bedzie zmieniac parametry rysunku.

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;

public class Migacz extends JFrame implements KeyListener
{
    private javax.swing.Timer timer=null;
    private MojPanel panel=null;
    protected Color kolor=new Color(100,100,100);
    private Random r=new Random();
    //------------------------
    public static void main(String[] args)
    {
        new Migacz();
    }
    //------------------------
    public Migacz()
    {
        super("Migacz");
        setSize(200,260);
        panel=new MojPanel(this);
        add(panel,BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        addKeyListener(this);
        setVisible(true);

        timer=new javax.swing.Timer(100,new ActionListener()
        {
            public void actionPerformed(ActionEvent evt)
            {
                kolor=new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256));
                panel.repaint();
            }
        });
    }
    //------------------------
    public void keyPressed(KeyEvent e)
    {
        if(e.getKeyCode()==KeyEvent.VK_M)
            timer.start();
    }
    //------------------------
    public void keyTyped(KeyEvent e)
    {
    }
    //------------------------
    public void keyReleased(KeyEvent e)
    {
        if(e.getKeyCode()==KeyEvent.VK_M)
            timer.stop();
    }
}
//------------------------------------------------
class MojPanel extends JPanel
{
    private Migacz parent;
    //------------------------
    public MojPanel(Migacz parent)
    {
        super();
        this.parent=parent;
    }
    //------------------------
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(parent.kolor);
        g.fillOval(70,70,60,60);
    }
}

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