[Java] - MouseListener i JButton

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
rafalstwa
Piegowaty Guziec
Piegowaty Guziec
Posty: 9
Rejestracja: 13 sty 2007, 02:19
Płeć: Mężczyzna
Wersja Ubuntu: 7.04
Środowisko graficzne: GNOME

[SOLVED] [Java] - MouseListener i JButton

Post autor: rafalstwa »

Witam, dodam na wstępie, że zacząłem nauke Javy i mam problem z podpięciem MouseListner-a pod JButton tak żeby po kliknięciu wyczyścił ekran. Szukałem i nie wiem gdzie tkwi problem. Poniżej zamieszczam kod. Dodam, że jakakolwiek zmiana z ręcznego rozmieszczenia elementów na menedżera Layout-u nic nie daje - sugestia z innego forum. Chciałem zrobić sobie prostą graficzną gierke + obsługa myszy do sterowania i nie moge przeskoczyć tej sprawy.
Dla większej przejrzystości usunąłem wszystko to co niepotrzebne i zostawiłem wyłącznie komponenty, które powinny być i JButton, o który się rozchodzi.

Kod: Zaznacz cały

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package puzzle;

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

/**
 *
 * @author rafalstwa
 */
public class Main implements MouseListener{
    JButton next;
    JFrame mainframe;

    public void Poczatek() {
    JFrame mainframe = new JFrame("Gierka1");
   
    mainframe.setLayout(null);
    mainframe.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    
    int wmainframe = 720;
    int hmainframe = 480;

    mainframe.setSize(wmainframe, hmainframe);

    Toolkit tool = Toolkit.getDefaultToolkit();
    Dimension sizeScreen = tool.getScreenSize();

    int wScreen = sizeScreen.width;
    int hScreen = sizeScreen.height;

    mainframe.setLocation((wScreen/2-wmainframe/2), (hScreen/2-hmainframe/2));

    Font Serifduza = new Font("Serif", Font.BOLD, 20) ;
    Font Serifmala = new Font("Serif", Font.BOLD, 15) ;

    JLabel tekst1 = new JLabel("Puzzle");
    tekst1.setBounds(wmainframe/2-50, 100,100, 30);
    tekst1.setFont(Serifduza);

 

    

    JButton next = new JButton("Przejdz dalej");
    next.setBounds(wmainframe-200, 400, 170, 40);
    next.setFont(Serifmala);
    next.addMouseListener(this);

 
   mainframe.getContentPane().setBackground(Color.WHITE);

   mainframe.getContentPane().add(tekst1);
   

   mainframe.getContentPane().add(next);

   mainframe.setVisible(true);
  }


    public void mouseEntered(MouseEvent e) {if (e.getSource() == next){mainframe.getContentPane().removeAll();}}
    public void mouseExited(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {if (e.getSource() == next) {mainframe.getContentPane().removeAll();}}
    public void mouseReleased(MouseEvent e){}
    public void mouseClicked(MouseEvent e) {if (e.getSource() == next) {mainframe.getContentPane().removeAll();}}


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
    
        Main nowa = new Main();
        nowa.Poczatek();
   
    }

}

goorzyn
Piegowaty Guziec
Piegowaty Guziec
Posty: 1
Rejestracja: 24 cze 2008, 13:34
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [Java] - MouseListener i JButton

Post autor: goorzyn »

Może i nie najlepszy kod ale na szybko i działający.

Kod: Zaznacz cały

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package puzzle;

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

/**
 *
 * @author rafalstwa
 */
public class Main {

    private JButton next;
    private JFrame mainframe;
    private JLabel tekst1;

    public void Poczatek() {
        mainframe = new JFrame("Gierka1");

        mainframe.setLayout(null);
        mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        int wmainframe = 720;
        int hmainframe = 480;

        mainframe.setSize(wmainframe, hmainframe);

        Toolkit tool = Toolkit.getDefaultToolkit();
        Dimension sizeScreen = tool.getScreenSize();

        int wScreen = sizeScreen.width;
        int hScreen = sizeScreen.height;

        mainframe.setLocation((wScreen / 2 - wmainframe / 2), (hScreen / 2 - hmainframe / 2));

        Font Serifduza = new Font("Serif", Font.BOLD, 20);
        Font Serifmala = new Font("Serif", Font.BOLD, 15);

        tekst1 = new JLabel("Puzzle");
        tekst1.setBounds(wmainframe / 2 - 50, 100, 100, 30);
        tekst1.setFont(Serifduza);

        next = new JButton("Przejdz dalej");
        next.setBounds(wmainframe - 200, 400, 170, 40);
        next.setFont(Serifmala);
        next.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                mainframe.remove(tekst1);
                mainframe.repaint();
            }
        });

        mainframe.getContentPane().setBackground(Color.WHITE);

        mainframe.getContentPane().add(tekst1);


        mainframe.getContentPane().add(next);

        mainframe.setVisible(true);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Main nowa = new Main();
        nowa.Poczatek();
    }
}
Awatar użytkownika
Nadril
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 171
Rejestracja: 11 lip 2008, 10:54
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Kontakt:

Odp: [Java] - MouseListener i JButton

Post autor: Nadril »

nie wiem czy bylo sens cały kod wklejać, bo były tylko dwa błędy:
1. Definujesz obiekty globalne (np. JButton next) po czym w funkcji Początek tworzysz nowe obiekty lokalne pod tymi samymi nazwami.
2. Po usuwaniu elementów nie masz wywołania odmalowania.

Komentarze sugerują że piszesz to w netbeansie, jeśli się nie mylę to pokazał Ci się warning "Local variable hides a field", polecam zwracać uwagę na warningi.

Powodzenia!
nwkj
Sędziwy Jeż
Sędziwy Jeż
Posty: 33
Rejestracja: 08 sie 2009, 14:53
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma

Odp: [Java] - MouseListener i JButton

Post autor: nwkj »

Kliknięcie JButtona można również (wygodniej?) złapać przez ActionListener.
Awatar użytkownika
Opalo
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 113
Rejestracja: 07 sty 2009, 09:52
Płeć: Mężczyzna

Odp: [Java] - MouseListener i JButton

Post autor: Opalo »

Dużo wygodniej i dużo lepiej, do tego właśnie jest ActionListener.
rafalstwa
Piegowaty Guziec
Piegowaty Guziec
Posty: 9
Rejestracja: 13 sty 2007, 02:19
Płeć: Mężczyzna
Wersja Ubuntu: 7.04
Środowisko graficzne: GNOME

Odp: [Java] - MouseListener i JButton

Post autor: rafalstwa »

Witam, dziekuje na wstępie za pomoc wszystkim.
Chciałbym się odnieść do niektórych kwestii poruszonych w tym watku:
Nadril pisze:nie wiem czy bylo sens cały kod wklejać, bo były tylko dwa błędy:
1. Definujesz obiekty globalne (np. JButton next) po czym w funkcji Początek tworzysz nowe obiekty lokalne pod tymi samymi nazwami.
2. Po usuwaniu elementów nie masz wywołania odmalowania.

Komentarze sugerują że piszesz to w netbeansie, jeśli się nie mylę to pokazał Ci się warning "Local variable hides a field", polecam zwracać uwagę na warningi.

Powodzenia!

Nie jestem żadnym znawcą Javy i jak zaznaczam dopiero się ucze tego języka, dlatego proszę o wyrozumiałość. Co do punktu pierwszego zgadzam się całkowicie, że jest to niepotrzebna deklaracja zmiennych ale korzystałem z nich w innej metodzie dlatego były tam umieszczone. Chciałem napisać metodę Czysc(), która usuwa mi wszystkie elementy okna po kliknięciu w odpowiedni Button. Zrezygnowałem z niej, a komponenty zostały - mój błąd.
Co do punktu drugiego to próbowałem takich poleceń

Kod: Zaznacz cały

mainframe.getContentPane().repaint();

Kod: Zaznacz cały

mainframe.repaint();
Niestety nie zadziałały.
Jeżeli mógłbyś go poprawić i wkelić byłbym wdzięczny. Tak samo ważne jest dla mnie podobne do twojego wyjaśnienie tego co należy(zostało) zmienić(zmienione) i ewentualny opis samego działania poprawionego kodu. Uczę się więc jest to dla mnie istotne.

Interesuje mnie rozwiązanie podane przez goorzyn-a. Działa, ale jeżeli może mi ktoś wyjaśnić jak, a chodzi mi o ten fragment kodu:
next.addMouseListener(new MouseAdapter() {

@Override
public void mouseClicked(MouseEvent e) {
polecenia do wykoniania;
}
});
Proszę o rozwinięcie ustne tego fragmentu, bo mam jakąś filozofię na ten temat ale pewnie się mylę. Prosiłbym też o wyjaśnienie, czy ta nadpisana metoda mouseClicked odnosi się do MouseListnera czy MouseAdaptera, a może jest jeszcze inaczej?

Teraz zasiadam do kombinowania z ActionListnerem zgodnie z sugestia i zobaczymy co mi wyjdzie z tych prób.

Pozdrawiam
Awatar użytkownika
Nadril
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 171
Rejestracja: 11 lip 2008, 10:54
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: KDE Plasma
Architektura: x86_64
Kontakt:

Odp: [Java] - MouseListener i JButton

Post autor: Nadril »

rafalstwa pisze: Co do punktu drugiego to próbowałem takich poleceń

Kod: Zaznacz cały

mainframe.getContentPane().repaint();

Kod: Zaznacz cały

mainframe.repaint();
Niestety nie zadziałały.
Dobrze pisałeś, może źle wklejałeś? Ja np. zmieniłem Twój kod tak i działa:

Kod: Zaznacz cały

public void mouseEntered(MouseEvent e) {if (e.getSource() == next){mainframe.getContentPane().removeAll(); mainframe.getContentPane().repaint();}}
Prosiłbym też o wyjaśnienie, czy ta nadpisana metoda mouseClicked odnosi się do MouseListnera czy MouseAdaptera, a może jest jeszcze inaczej?
Bezpośrednio odnosi się do MouseAdaptera, ale ten jest parametrem MouseListnera, więc do niego też się odnosi. Możesz MouseAdaptera wyjąć z MouseListenera nadać mu jakąś nazwę i po nazwie wskazać w MouseListenerze, może tak będzie dla Ciebie jaśniej.
Teraz zasiadam do kombinowania z ActionListnerem zgodnie z sugestia i zobaczymy co mi wyjdzie z tych prób.
Jest dobry tutorial oracla: http://download.oracle.com/docs/cd/E174 ... tener.html jak i pozostałe strony.
Awatar użytkownika
kamilsilver
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 105
Rejestracja: 06 lis 2008, 21:53
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: KDE Plasma
Architektura: x86

Odp: [Java] - MouseListener i JButton

Post autor: kamilsilver »

next.addMouseListener(new MouseAdapter() {

@Override
public void mouseClicked(MouseEvent e) {
//polecenia do wykoniania;
}
});
Jest to klasa anonimowa.
Jak widać tworzy nowy listener[adapter] (bez nazwy [nie ma MouseAdapter nazwa = new MouseAdapter()] i od razu definiując ciało tego listenera (adaptera - ciało do mouseClicked). Dzięki czemu możemu od razu zdefiniować ciało listenera od razy go dodać, bez odwoływania się do zdefiniowanych metod. U mnie prowadzący wolał klasy adaptacyjne od zewnętrznych metod.

Wiedz, że netBeans ma bardzo fajny edytor graficzny do tworzenia aplikacji graficznych, który na prawdę fajnie się obsługuje.
Temat rozwiązany? Dodaj [solved] w tytule tematu :)
Inny OS => Debian Squeeze (testing)
rafalstwa
Piegowaty Guziec
Piegowaty Guziec
Posty: 9
Rejestracja: 13 sty 2007, 02:19
Płeć: Mężczyzna
Wersja Ubuntu: 7.04
Środowisko graficzne: GNOME

Odp: [Java] - MouseListener i JButton

Post autor: rafalstwa »

Cześć, to znowu ja z moimi pomysłami.

Od ostatniego czasu przebudowałem swoją aplikację i teraz zastanawiam się jak wygląda skalowanie obrazów w Javie. Po wielu próbach kombinując doszedłem do takiego rozwiązania ażeby wyskalować obraz i go wkleić w miejsce, które mi pasuje.

Kod: Zaznacz cały

ImageIcon Logo = new ImageIcon("Logo.jpg");
Image obrazek = Logo.getImage().getScaledInstance(250,150,java.awt.Image.SCALE_SMOOTH);
ImageIcon Logo2 = new ImageIcon(obrazek);
int hIcon = Logo2.getIconHeight();
int wIcon = Logo2.getIconWidth();
JLabel logo = new JLabel();
logo.setIcon(Logo2);
logo.setBounds(wmainframe/2-wIcon/2, 90,wIcon,hIcon);
Może jest jakaś prostsza metoda od mojej i bardziej przejrzyszta bo tutaj musze kombinować na zmiane z Image i ImageIcon żeby dostać to co chcę.
Kolejne pytanie jest umieszczenie pliku graficznego w archiwum *.jar i odwołanie się do jego ścieżki, żeby w przypadku uruchomienia aplikacji korzystać z grafiki umieszczonej wewnątrz archiwum? Wiem jak je umieścić w środku ale jak z nich skorzystać już nie.

Przed momentem trafiłem na cos takiego na stronie oracla-a w ich oficjalnym tutorialu odnośnie plików jar i wyciąganiu czegokolwiek z tygo typu archiwum:
http://download.oracle.com/docs/cd/E174 ... etresource

Kod: Zaznacz cały

java.net.URL imageURL = NazwaKlasy.class.getResource("sciezka do pliku wewnatrz archiwum");
ImageIcon Logo = new ImageIcon(imageURL);
To rozwiązanie, zwraca mi bład w postaci:

Kod: Zaznacz cały

Exception in thread "main" java.lang.NullPointerException
        at javax.swing.ImageIcon.<init>(ImageIcon.java:155)
        at grapuzzle.Main.Menu(Main.java:110)
        at grapuzzle.Main.main(Main.java:132)
Prawde mówiąc to nie wiem co jest grane.

Zapomnijmy o tych pytaniach i potraktujmy post jako zamknięty ponieważ obsługa zdarzeń w tym momencie to pestka.
Dzięki i pozdrawiam.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 28 gości