java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > AWT, Swing, JavaFX & SWT

AWT, Swing, JavaFX & SWT Themen zur Programmierung von Benutzer-Oberflächen (GUI, Applet) sowie zur Grafikprogrammierung (2D / 3D)

Thema geschlossen     Ist dieses Thema erledigt?
Themen-Optionen Thema durchsuchen Ansicht
Alt 11.11.2009, 09:42   #1 (permalink)
Benutzer
double
 
Registriert seit: 18.10.2009
Fachbeiträge: 64
Abgegebene Danke: 2
Erhielt 2 Danke für 2 Beiträge
Standard Eigene JComponent mit MouseListener versehen

Hallo Leute,

ich habe mal wieder ein Problem, diesmal in Swing, und habe noch keine Lösung im Forum gefunden.
Wäre Klasse, wenn ihr mir wieder so schnell helfen könntet.

Also hier das Problem:

Ich versuche selbstgestaltete Felder zu programmieren, die z.B. beim Anklicken ihre Farbe wechseln können. Da ich davon mehrere habe, dachte ich, dass ich die Kontrolle per MouseListener nicht in der Mutter-Komponente (also in dem JPanel wo alle drin sind) mache, sondern jedem Feld seinen eigenen MouseListener geben könnte.
Im MouseListener wird auch ne Testausgabe gemacht, die kommt aber leider nicht zum Vorschein.

Hier jetzt erstmal der Code:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
 
import javax.swing.JComponent;
 
public class Field extends JComponent implements MouseListener{
 
    private static final long serialVersionUID = 1L;
    private int x;
    private int y;
    private int lang;
    private Color color = Color.BLUE;
    
    public Field(int x, int y, int lang){
        this.setX(x);
        this.setY(y);
        this.setLang(lang);
        this.addMouseListener(this);
        this.setSize(lang, lang);
    }
    
    public int min(int i, int j){
        if(i < j){
            return i;
        }
        else{
            return j;
        }
    }
    
    public void setColor(Color col){
        this.color = col;
    }
    
    public void draw(Graphics g){
        g.setColor(color);
        g.fillRoundRect(x, y, lang, lang, lang/2, lang/2);
    }
 
    @Override
    public void mouseClicked(MouseEvent e){
        Point p = e.getPoint();
        System.out.println("rofl");
        if(p.getX()<this.x+this.lang&&p.getX()>this.x&&p.getY()<this.y+this.lang&&p.getY()>this.y){
            this.setColor(Color.BLACK);
        }
        repaint();
    }
 
    @Override
    public void mouseEntered(MouseEvent e){
        System.out.println("X");
    }
 
    @Override
    public void mouseExited(MouseEvent e){
        
    }
 
    @Override
    public void mousePressed(MouseEvent e){
        
    }
 
    @Override
    public void mouseReleased(MouseEvent e){
        
    }
}

Ich hoffe ihr könnt mir weiterhelfen.

Danke schonmal.

LG von mir^^
1337iceskater ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 11.11.2009, 09:53   #2 (permalink)
Benutzer
int
 
Registriert seit: 15.10.2009
Fachbeiträge: 55
Abgegebene Danke: 1
Erhielt 2 Danke für 2 Beiträge
Hi,
bitte mal den ganzen Code!
__________________
MFG
Java@home ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 11.11.2009, 09:57   #3 (permalink)
Stammbenutzer
CD-R 80
 
Registriert seit: 17.02.2009
Fachbeiträge: 7.116
Abgegebene Danke: 7
Erhielt 1.105 Danke für 1.103 Beiträge
Kann keinen Fehler finden. Bist Du Dir sicher, dass Du die Komponente mit der Maus erwischt bzw. dass die Komponente die Größe und Lage hat die Du vermutest?
Michael... ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 11.11.2009, 10:01   #4 (permalink)
Benutzer
double
Themenstarter
 
Registriert seit: 18.10.2009
Fachbeiträge: 64
Abgegebene Danke: 2
Erhielt 2 Danke für 2 Beiträge
Standard re:aw

das ist schon der ganze code der Klasse, diese Elemente werden dann mit der folgenden Funktion in ein JPanel hinzugefügt. Dieses JPanel liegt dann in dem JFrame was als Hauptfenster dient. Ich poste am Ende mal alle Klassen, die ich zur Zeit verwende.

Funktion zum Hinzufügen:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
private static Vector<Field> fields = new Vector<Field>();
 
public void initFields(){
    for(int i = 0; i < fieldRow; i ++){
        for(int j = 0; j < fieldCol; j++){
            fields.add(new Field(j*lang, i*lang, lang));
        }
    }
}

So, und hier dann die kompletten Klassen:

Field-Klasse:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package risiko;
 
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
 
import javax.swing.JComponent;
 
public class Field extends JComponent implements MouseListener{
 
    private static final long serialVersionUID = 1L;
    private int x;
    private int y;
    private int lang;
    private Color color = Color.BLUE;
    
    public Field(int x, int y, int lang){
        this.setX(x);
        this.setY(y);
        this.setLang(lang);
        this.addMouseListener(this);
        this.setSize(lang, lang);
    }
    
    public int min(int i, int j){
        if(i < j){
            return i;
        }
        else{
            return j;
        }
    }
    
    public void setColor(Color col){
        this.color = col;
    }
    
    public void draw(Graphics g){
        g.setColor(color);
        g.fillRoundRect(x, y, lang, lang, lang/2, lang/2);
    }
 
    @Override
    public void mouseClicked(MouseEvent e){
        Point p = e.getPoint();
        System.out.println("rofl");
        if(p.getX()<this.x+this.lang&&p.getX()>this.x&&p.getY()<this.y+this.lang&&p.getY()>this.y){
            this.setColor(Color.BLACK);
        }
        repaint();
    }
 
    @Override
    public void mouseEntered(MouseEvent e){
        System.out.println("X");
    }
 
    @Override
    public void mouseExited(MouseEvent e){
        
    }
 
    @Override
    public void mousePressed(MouseEvent e){
        
    }
 
    @Override
    public void mouseReleased(MouseEvent e){
        
    }
    
    public boolean isIn(Point p){
        if(p.getX()<this.x+lang&&p.getX()>this.x){
            if(p.getY()<this.y+lang&&p.getY()>this.y){
                return true;
            }
        }
        return false;
    }
 
    public void setX(int x) {
        this.x = x;
    }
 
    public int getX() {
        return x;
    }
 
    public void setY(int y) {
        this.y = y;
    }
 
    public int getY() {
        return y;
    }
 
    public void setLang(int lang) {
        this.lang = lang;
    }
 
    public int getLang() {
        return lang;
    }
}

GameField-Klasse:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package risiko;
 
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
 
import javax.swing.JPanel;
 
public class GameField extends JPanel implements MouseListener{
 
    
    private int lang;
    private int fieldCol = 10;
    private int fieldRow = 2;
    private static final long serialVersionUID = 1L;
    private static Vector<Field> fields = new Vector<Field>();
 
    public void initFields(){
        for(int i = 0; i < fieldRow; i ++){
            for(int j = 0; j < fieldCol; j++){
                fields.add(new Field(j*lang, i*lang, lang));
            }
        }
    }   
    
    public GameField(Dimension d){
        super();
        this.lang = (int)(d.getHeight()/7);
        this.setBackground(Color.WHITE);
//      this.addMouseListener(this);
        initFields();
    }
    
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        for(int i = 0; i < fields.size(); i++){
            fields.get(i).draw(g);
        }
    }
    
    @Override
    public void mouseClicked(MouseEvent e){
        System.out.println("rofl");
        for(int i = 0; i < fields.size(); i++){
            if(fields.get(i).isIn(e.getPoint())){
                fields.get(i).setColor(Color.BLACK);
            }
            else{
                fields.get(i).setColor(Color.BLUE);
            }
        }
        repaint();
    }
 
    @Override
    public void mouseEntered(MouseEvent e){
        
    }
 
    @Override
    public void mouseExited(MouseEvent e){
        
    }
 
    @Override
    public void mousePressed(MouseEvent e){
        
    }
 
    @Override
    public void mouseReleased(MouseEvent e){
        
    }
}

Risiko-Klasse:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package risiko;
 
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
 
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
 
public class Risiko extends JFrame{
 
    public static Dimension screen;
    private static GameField gf;
    private static final long serialVersionUID = 1L;
    
    public Risiko(){
        super("Risiko");
        screen = Toolkit.getDefaultToolkit().getScreenSize();
        this.setSize(screen);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new BorderLayout());
        
        this.addKeyListener(new KeyListener(){
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
                    System.exit(0);
                }
            }
            @Override
            public void keyReleased(KeyEvent e) {
                
            }
            @Override
            public void keyTyped(KeyEvent e){
                
            }           
        });
        
        gf = new GameField(screen);
        
        JMenuBar mb = new JMenuBar();
        JMenu file = new JMenu("Datei");
        JMenuItem neu = new JMenuItem("Neues Spiel");
        
        JMenuItem ext = new JMenuItem("Beenden");
        
        file.add(neu);
        file.add(ext);
        mb.add(file);
        
        this.add(mb, BorderLayout.NORTH);
        this.add(gf, BorderLayout.CENTER);
        
        this.setVisible(true);
    }
    
    public static void main(String[] args){
        new Risiko();
    }
}

so, das ist jetzt erstmal ziemlich viel
hoffe das hilft weiter.
Danke
1337iceskater ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 11.11.2009, 10:09   #5 (permalink)
Stammbenutzer
Megabyte
 
Registriert seit: 10.08.2009
Fachbeiträge: 1.201
Abgegebene Danke: 23
Erhielt 166 Danke für 166 Beiträge
So wie ich das sehe, fügst du deine Fields nirgends dem Panel hinzu, also in initFields() ist kein this.add( field );
Ich nehme an, dass daher keine MouseEvents ankommen.
__________________
Gruß, KrokoDiehl.
KrokoDiehl ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 11.11.2009, 10:15   #6 (permalink)
Benutzer
int
 
Registriert seit: 15.10.2009
Fachbeiträge: 55
Abgegebene Danke: 1
Erhielt 2 Danke für 2 Beiträge
wo ist den der MouseListener(was machen die in all den anderen Klassen) in der Klasse Risiko?
Du willst doch, dass beim klicken auf die Componenten was passiert, oder?
__________________
MFG

Geändert von Java@home (11.11.2009 um 10:18 Uhr)
Java@home ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 11.11.2009, 10:16   #7 (permalink)
Benutzer
double
Themenstarter
 
Registriert seit: 18.10.2009
Fachbeiträge: 64
Abgegebene Danke: 2
Erhielt 2 Danke für 2 Beiträge
Standard re,re,re

Danke für den Hinweis, das hab ich wirklich nicht bedacht.

Leider hat das auch nichts an der Nichtfunktionalität geändert. Die initFields sieht jetzt so aus.

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
public void initFields(){
    for(int i = 0; i < fieldRow; i ++){
        for(int j = 0; j < fieldCol; j++){
            Field f = new Field(j*lang, i*lang, lang);
            fields.add(f);
            this.add(f);
        }
    }
}

Ich beginne langsam an mir zu zweifeln...
1337iceskater ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 11.11.2009, 10:25   #8 (permalink)
Benutzer
int
 
Registriert seit: 15.10.2009
Fachbeiträge: 55
Abgegebene Danke: 1
Erhielt 2 Danke für 2 Beiträge
Schaue dir das mal bitte etwas genauer an!
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
public GameField(Dimension d){
        super();
        this.lang = (int)(d.getHeight()/7);
        this.setBackground(Color.WHITE);
//      this.addMouseListener(this);
        initFields();
    }
__________________
MFG
Java@home ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 11.11.2009, 10:31   #9 (permalink)
Benutzer
double
Themenstarter
 
Registriert seit: 18.10.2009
Fachbeiträge: 64
Abgegebene Danke: 2
Erhielt 2 Danke für 2 Beiträge
Ich weiß, dass ich da den MouseListener nicht hinzufüge. Das liegt daran, dass das meine erste Variante ist. Da wollte ich alle Fields durchgehen, da die in dem Vector gespeichert sind, und wenn das Field dann den Punkt beinhaltet wird dort etwas mit dem Field gemacht. Das ist aber sehr unperformant.

Der MouseListener um den es geht befindet sich in der Klasse Field:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
public Field(int x, int y, int lang){
    this.setX(x);
    this.setY(y);
    this.setLang(lang);
    this.addMouseListener(this);
    this.setBounds(0, 0, lang, lang);
}

Hier dann noch die Methoden des MouseListeners:

Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Override
public void mouseClicked(MouseEvent e){
    Point p = e.getPoint();
    System.out.println("rofl");
    if(p.getX()<this.x+this.lang&&p.getX()>this.x&&p.getY()<this.y+this.lang&&p.getY()>this.y){
        this.setColor(Color.BLACK);
    }
    repaint();
}
@Override
public void mouseEntered(MouseEvent e){
    System.out.println("X");
}
@Override
public void mouseExited(MouseEvent e){
    
}
@Override
public void mousePressed(MouseEvent e){
    
}
@Override
public void mouseReleased(MouseEvent e){
    
}
1337iceskater ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 11.11.2009, 11:10   #10 (permalink)
Stammbenutzer
CD-R 80
 
Registriert seit: 17.02.2009
Fachbeiträge: 7.116
Abgegebene Danke: 7
Erhielt 1.105 Danke für 1.103 Beiträge
Färbe doch mal die Felder im Konstruktor ein, damit Du siehst ob und wo sie dargestellt werden.
Michael... ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 11.11.2009, 11:34   #11 (permalink)
Benutzer
double
Themenstarter
 
Registriert seit: 18.10.2009
Fachbeiträge: 64
Abgegebene Danke: 2
Erhielt 2 Danke für 2 Beiträge
Oh ich glaube ich hab den Fehler^^

ich hab meinem JPanel noch kein Null-Layout gegeben. Dadurch waren die Components jeweils nicht sichtbar gewesen.

Danke trotzdem für eure Hilfe =)
__________________
Luftpiraten sind Passagiere, die Flugzeuge erst unterwegs chartern.
1337iceskater ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Thema geschlossen     Ist dieses Thema erledigt?

Stichworte
eigene jcomponent , jcomponent , mouselistener

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
JComponent übereinanderlegen Nestor AWT, Swing, JavaFX & SWT 1 10.04.2008 14:20
Frage zu MouseListener und speichern des Wertes (reflektion? Gast AWT, Swing, JavaFX & SWT 6 28.09.2006 09:20
Resize Problem bei JComponent Robinson AWT, Swing, JavaFX & SWT 2 02.09.2006 13:57
JFileChooser: das *.* Problem Helian AWT, Swing, JavaFX & SWT 28 01.12.2005 07:50


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:16 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de