MouseClicked podmiana jlabel po kliknięciu

0

Mam jakiś JFrame, gdzie umieściłem 3 label'e (test1, test2, test3).

 
public class test extends javax.swing.JFrame {

    /** Creates new form test */
    public test() {
        initComponents();
    }
    
    @SuppressWarnings("unchecked")

    private void test1MouseClicked(java.awt.event.MouseEvent evt) {
       
        // TODO add your handling code here:
    }

    private void test2MouseClicked(java.awt.event.MouseEvent evt) {
        
        // TODO add your handling code here:
    }

    private void test3MouseClicked(java.awt.event.MouseEvent evt) {
       
        // TODO add your handling code here:
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new test().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JLabel test1;
    private javax.swing.JLabel test2;
    private javax.swing.JLabel test3;
    // End of variables declaration

}

chcę aby program działał tak, że kliknę na ** test1** -> później na test2 -> i po kliknięciu na test2 label'e zamienią się pozycjami w okienku. Tak samo jeżeli kliknę na np. test1 -> później na test3 itd.
Proszę o pomoc w napisaniu tej części kodu lub jakiś wzorzec.

0

Witam
Po pierwsze potrzebujesz zmiennych pomocniczych czy (boolean) i ktory (int)
void kliktest1(){
System.out.println("Zostal klikniety label 1");
if (czy == false) {
czy = true;
ktory = 1;
}
else {
p = test1.getText();
if (ktory == 2) {
test1.setText(test2.getText());
test2.setText(p);
}
if (ktory == 3) {
test1.setText(test3.getText());
test3.setText(p);
}
czy = false;
ktory = 0;
p = "";
}
};
void kliktest2(){
System.out.println("Zostal klikniety label 2");
if (czy == false) {
czy = true;
ktory = 2;
}
else {
p = test2.getText();
if (ktory == 1) {
test2.setText(test1.getText());
test1.setText(p);
}
if (ktory == 3) {
test2.setText(test3.getText());
test3.setText(p);
}
czy = false;
ktory = 0;
p = "";
}
};
void kliktest3(){
System.out.println("Zostal klikniety label 3");
if (czy == false) {
czy = true;
ktory = 3;
}
else {
p = test3.getText();
if (ktory == 1) {
test3.setText(test1.getText());
test1.setText(p);

                }
                if (ktory == 2) {
                    test3.setText(test2.getText());
                    test2.setText(p);
                }
                czy = false;
                ktory = 0;
                p = "";
            }
};

Oczywiście można to zrobić zgrabniej ale to też działa :)

0

OK, coś to pewnie robi, ale patrząc po kodzie nie to co chcę osiągnąć. Mam stworzone w JFrame Jlabel'e i w Properties moich JLabel'ów zmieniłem icon na swój obrazek. Jak zrobić aby po kliknięciu na JLabel1, a następnie na JLabel2 te dwa JLabe'e zamieniły się miejscami w okienku?

0

Nie rozumiem...klikasz na Jlabelu? ale po co? jLabel nie służy do klikania...dobrze Ci kolega napisał - jak już to zmieniasz zawartosc JLabela. Kliknij i zmień zawartośc a nie sam z siebie komponent.

0

Czy musisz zmieniać je miejscem? Równoważny efekt osiągniesz podmieniając wzajemnie tylko ikony labeli, bez rzeczywistej zmiany miejsc JLabeli.

Prosty algorytm (nie chce mi się tego kodować):
1 - stwórz tablicę JLabeli (nie trzy różne JLabele, tylko 3-elementową tablicę typu JLabel),
2 - do każdego elementu podepnij MouseListenera:

for (int i=0;i<labels.length;i++) 
    labels[i].addMouseListener(new java.awt.event.MouseAdapter() {
        @Override
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            metodaZmieniajacaIkonyLabeli(i);
        }
    });

// metoda:
private void metodaZmieniajacaIkonyLabeli (int i) {
    if (aktualnieWybranyLabel == -1) aktualnieWybranyLabel = i;
    else {
        if (aktualnieWybranyLabel != i) {
            Icon bufferIcon = labels[i].getIcon();
            labels[i].setIcon(labels[aktualnieWybranyLabel].getIcon());
            labels[aktualnieWybranyLabel].setIcon(bufferIcon);
        }
        aktualnieWybranyLabel = -1;
    }
}

zmienna 'aktualnieWybranyLabel' jest typu int, i przy deklaracji nadaną ma wartość '-1' (-1 będzie oznaczał aktualnie 'pusty' wybór)

tyle. Jeżeli koniecznie musisz zamieniać miejscami labele, a nie tylko zmieniać ich ikony, zamiast

Icon bufferIcon = labels[i].getIcon();
labels[i].setIcon(labels[aktualnieWybranyLabel].getIcon());
labels[aktualnieWybranyLabel].setIcon(bufferIcon);

wrzuć:

int bufferX = labels[i].getLocation().x, bufferY = labels[i].getLocation().y;
labels[i].setLocation(labels[aktualnieWybranyLabel].getLocation().x,labels[aktualnieWybranyLabel].getLocation().y);
labels[aktualnieWybranyLabel].setLocation(bufferX,bufferY);

tyle editów... nie moge do nowego stylu forum się przyzwyczaić.. :)

0

Tworzę grę, i na planszy stworzyłem jlabel, który jest kostką, i wrzuciłem do niego obrazki (6 obrazków bo 6 ścian kostek). Po najechaniu na jlabel kursorem za pomocą scrolla zmieniam je sobie.

W załączniku zamieściłem planszę:
-po żółtych polach (kwadratach) chcę przesuwać moją kostkę (jlabel'a).
Wymyśliłem, że zamiast przesuwania można na wszystkich żółtych polach zainstalować jLabel'e i przez kliknięcie na kostkę, a następnie na wybrany pusty jLabel zamieniać je miejscami.
Nie mogę zamieniać ikon zawartych w jlabelach, ponieważ wtedy nie będzie działać moja kostka.
Chyba, że zrezygnuję z tego i po prostu będę przesuwać moją kostkę (jlabel) po żółtych polach; myślę, że jak będę zamieniał miejscami labele to łatwiej będzie mi później tworzyć warunki gry.
Może ktoś ma inny pomysł jak by można to rozwiązać.

0

Kolega Billy napisał wszystko co mogłoby Ci się przydać w tym temacie. Jego kod jest zwyczajnie zgrabniejszy niż mój. Napisał nawet jak podmieniać miejscami labele a nie tylko ich właściwości lub zawartość.
Pozdrawiam

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