"Dynamiczna" zmiana kursora

0

Cześć, chcę zrobić prosty edytor graficzny, w którym do dyspozycji są na razie dwa narzędzia - powiedzmy ołówek i gumka. Chciałbym, aby bo wciśnięciu przycisku z ikonką ołówka kursor zmienił się w ołówek, a po naciśnięciu przycisku z gumką - w gumkę. O ile podobna zmiana kursora wychodzi bez problemu dla kursorów predefiniowanych i z kursora "łapki" mogę przełączać się na kursor krzyżyka, to w przypadku własnych kursorów załadowanych przez toolkit.createCustomCursor żadna zmiana nie zachodzi po wywołaniu. Przypuszczam, że jedynym momentem, kiedy można ustawić kursor jest faza inicjalizacji komponentu. Ma ktoś jakieś pomysły, jak to obejść, o ile w ogóle jest to możliwe?

0

Zasłyszane w internecie:

public static Cursor getDefaultCursor()
    {
        Cursor defaultCursor = null;
 
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        URL cursorUrl = ChangingCursorExample.class.getResource("Cursor.gif");
        Image cursorImage = new ImageIcon(cursorUrl).getImage();
        defaultCursor = toolkit.createCustomCursor(cursorImage, new Point(1, 1),"AA_Cursor");
        
        return defaultCursor;
    }
0

Koziołek, wiem, jak się ładuje własne kursory, ale nie w tym problem. Chodzi o to, żeby zmiana kursora danego komponentu na kursor niestandardowy mogła wystąpić już po wyświetleniu tego komponentu.

0

Stosuję dość trywialną ale skuteczną metodę: tworzę własny kursor sposobem Koziołka, a potem wywołuję
panel.setCursor(kursor);
panel jest klasy JPanel, kursor jest klasy Cursor
pozdrawiam

0

Bogdans, ale ja właśnie robie dokładnie tak samo. Spróbuj swoją metodą zmienić kursor komponentu PO jego wyświetleniu. Jeżeli Ci się to uda, to będę bardzo zdziwiony, bo u mnie kursor wcale się nie zmienia, kiedy próbuję robić tak, jak mówisz.

0

@DooM77, a słyszaleś może o MouseEvent i w szczególności o jednym z nich:
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/MouseEvent.html#MOUSE_ENTERED

Mysz wchodzi na komponent zmieniasz wychodzi zmieniasz.

0

Koziołek, nie musisz stosować żadnych mouseEventów, bo metoda comp.setCursor(..) polega właśnie na tym, że kursor zmienia się wtedy, kiedy mysz jest nad komponentem comp, a kiedy zabierasz mysz znad niego, zmienia się do pierwotnej postaci. Ale kursor nie chce się zmienić niezależnie od tego, w jakim evencie wywołuję metodę setCursor(...) podając w argumencie kursor niestandardowy.

0

Ja zmieniam kursor po ActionEvent, konstruuję kursor taką funkcją:

    private Cursor myCursor(String name)
    {
        Toolkit tk=Toolkit.getDefaultToolkit();
        Image i=new ImageIcon(name+".jpg").getImage();
        int height=i.getHeight(panel);
        int width=i.getWidth(panel);
        Dimension size=tk.getBestCursorSize(width,height);
        return tk.createCustomCursor(i,new Point(0,0),name);
    }

pozdrawiam

0

Funkcję tworzącą kursor wziąłem ze starego programu, po opublikowaniu zobaczyłem że ma nieużywane fragmenty. W poniższej formie też działa

    private Cursor myCursor(String name)
    {
        Toolkit tk=Toolkit.getDefaultToolkit();
        Image i=new ImageIcon(name+".jpg").getImage();
        return tk.createCustomCursor(i,new Point(0,0),name);
    }

pozdrawiam

0

Ja zmieniam kursor po ActionEvent

Bogdans i zmienia Ci się ten kursor po wystąpieniu ActionEvent? A jeżeli po innym ActionEvent będziesz chciał mieć inny kursor, to będziesz mógł się przełączać między nimi? No bo mówię Ci przez cały czas, że umiem tworzyć custom cursor, tylko nie chce mi się on włączać na życzenie :(.

0

Zmienia mi się

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

public class Mysz extends JFrame implements MouseListener
{
    private Color c=null;
    private Cursor ramka=null;
    //------------------------
    public static void main(String args[])
    {
        new Mysz();
    }
    //------------------------
    public Mysz()
    {
        setLayout(new FlowLayout());
        for (int i=0;i<5;i++)
        {
            JButton b=new JButton("A | "+(i+1));
            b.addMouseListener(this);
            add(b);
            c=b.getBackground();
        }
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        
        ramka=myCursor("resources/Winkiel");
    }
    //------------------------
    public void mouseClicked(MouseEvent e)
    {
        int m=e.getModifiers();
        int x=e.getX();
        int y=e.getY();
    }
    //------------------------
    public void mouseEntered(MouseEvent e)
    {
        e.getComponent().setBackground(Color.yellow);
        e.getComponent().setCursor(ramka);
    }
    //------------------------
    public void mouseExited(MouseEvent e)
    {
        if (c==null)
        {
            e.getComponent().setBackground(SystemColor.control);
        }
        else
        {
            e.getComponent().setBackground(c);
        }
        e.getComponent().setCursor(Cursor.getDefaultCursor());
    }
    //------------------------
    public void mousePressed(MouseEvent e)
    {
    }
    //------------------------
    public void mouseReleased(MouseEvent e)
    {
    }
    //------------------------
    private Cursor myCursor(String name)
    {
        Toolkit tk=Toolkit.getDefaultToolkit();
        Image i=new ImageIcon(name+".jpg").getImage();
        return tk.createCustomCursor(i,new Point(0,0),name);
    }
}
0

Wow, Bogdans, przerobiłem Twój programik w taki sposób, żeby bardziej odpowiadał mojej sytuacji i... rzeczywiście, wszystko działa! Oto, jak on teraz wygląda:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Mysz extends JDialog
{
    private Color c=null;
    private Cursor ramka1 = null;
    private Cursor ramka2 = null;
    
    JPanel panGorny = new JPanel();
    
    //------------------------
    public static void main(String args[])
    {
        new Mysz();
    }
    //------------------------
    public Mysz()
    {	
        setPreferredSize(new Dimension(350,200));
        JPanel pan = new JPanel();
        
        ramka1=myCursor("img/kursorOlowek");
        ramka2=myCursor("img/strzalka");
        
        for (int i=0;i<2;i++)
        {
            JButton b=new JButton("A | "+(i+1));
            //b.addMouseListener(new MyszLst(ramka1));
            b.addActionListener(new MyszALst(ramka1));
            pan.add(b);
            c=b.getBackground();
        }
        for (int i=3;i<5;i++)
        {
            JButton b=new JButton("A | "+(i+1));
            //b.addMouseListener(new MyszLst(ramka2));
            b.addActionListener(new MyszALst(ramka2));
            pan.add(b);
            c=b.getBackground();
        }
        
        pack();
        
        add(pan,BorderLayout.PAGE_END);
        panGorny.setBackground(Color.red);
        add(panGorny);
        
        setLocationRelativeTo(null);
        setVisible(true);
    }
    
    protected void processWindowEvent(WindowEvent e) {
    	if(e.getID() == WindowEvent.WINDOW_CLOSING)
    		System.exit(0);
    }
    
    private class MyszLst extends MouseAdapter{
    	Cursor kursor = null;   

    	public MyszLst(Cursor kursor) {
    		this.kursor = kursor;
    	}


    	public void mouseEntered(MouseEvent e)
    	{
    		e.getComponent().setBackground(Color.yellow);
    		panGorny.setCursor(kursor);
    	}

    }
    
    private class MyszALst implements ActionListener{
    	Cursor cur;
 
    	public MyszALst(Cursor cur) {
			this.cur = cur;
    	}

		public void actionPerformed(ActionEvent arg0) {
			 panGorny.setCursor(cur);
    	}
    }
    private Cursor myCursor(String name)
    {
        Toolkit tk=Toolkit.getDefaultToolkit();
        Image i=new ImageIcon(name+".png").getImage();
        return tk.createCustomCursor(i,new Point(0,0),name);
    }
}

Niezależnie od tego, czy uaktywnimy słuchaczów zdarzeń czy słuchaczów myszki kursor zmienia się poprawnie. W takim razie wygląda na to, że coś konkretnie z moim programem jest nie tak, bo w tej najprostszej wersji wszystko działa poprawnie. W takim razie sorry za niepotrzebny temat i za fatygę :(. Dzięki serdeczne, Bogdans :).

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