Hi zusammen,
ich hab hier einen kleinen Beispiel-Code (lauffähig), der wirklich nur dazu dient, mein Problem hier hoffentlich zu lösen.
Also, ich hab ein JPanel, in dem ich 2 Bereiche (farblich hervorgehoben) definiert hab, wo auf einen Mausklick hin etwas geschehen soll.
Wenn man in den grauen Bereich klickt (Klasse CheckPoint), dann erscheint zuerst ein schwarzer Kreis, beim nächsten Klick dann ein Kreis mit schwarzem Rand, dann ein Kreuz und beim letzten Klick ist alles wieder weg. Funktioniert also, so wie es soll.
Nun brauch ich eine ähnliche Funktionalität für ein Label (liegt im blauen Bereich), nur dass dies nicht mehr über die Paint-Methode geschehen soll, sondern über setVisible true/false. Also hab ich mir gedacht, mach ich das genauso und schreib einfach eine Klasse CheckLabel, die genauso funktioniert wie CheckPoint, nur eben mit dem Unterschied, dass ich jetzt nicht mehr repaint aufrufe, sonder setVisible des Labels auf true bzw. false setze. Und was ist, es funktioniert nicht
Beim ersten Klick wird das Label zwar noch sichtbar, aber beim zweiten Klick verschwindet es nicht mehr.
Was ich daran nicht verstehe ist, dass ich ja eigentlich bei CheckLabel nichts anders gemacht hab, als bei CheckPoint, mal abgesehen vom Aufruf von repaint - brauch ich hier aber auch nicht. Warum wird bei CheckLabel auch noch die Prüfung auf ...== null durchgefhrt (an der muss es ja liegen, da das Label ja wieder erscheint) und bei CheckPoint nicht?
Kann mir von Euch jemand erklären, warum das so ist und mir bei der Lösung meines Problems (Label erscheinen/verschwinden lassen) behilflich sein?
Grüße,
muemmel
ich hab hier einen kleinen Beispiel-Code (lauffähig), der wirklich nur dazu dient, mein Problem hier hoffentlich zu lösen.
Also, ich hab ein JPanel, in dem ich 2 Bereiche (farblich hervorgehoben) definiert hab, wo auf einen Mausklick hin etwas geschehen soll.
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
import java.util.*;
public class Test extends JFrame {
FretBoard rahmen = new FretBoard();
Test() {
super();
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().add(rahmen);
}
public class FretBoard extends JPanel {
HashMap<Point, Integer> merker = new HashMap<Point, Integer>();
DrawNote note = new DrawNote();
CheckPoint check = new CheckPoint();
CheckLabel checkL = new CheckLabel();
int mouse_x, mouse_y;
JLabel zeig = new JLabel();
FretBoard() {
setLayout(null);
setBackground(Color.WHITE);
setPreferredSize(new Dimension(210, 160));
zeig.setText("Hallo");
zeig.setBounds(40,100,50,30);
zeig.setVisible(false);
add(zeig);
addMouseListener(new Maus());
}
public void update(Graphics g) {
paintComponent(g);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(new Color(220,220,220));
g.fillRect(30,20,80,50);
g.setColor(new Color(213,234,255));
g.fillRect(30,90,80,50);
note.show(g);
}
public class DrawNote extends Point {
private int x,y;
DrawNote() {
}
DrawNote(int x_K, int y_K) {
x = x_K;
y = y_K;
}
public void show(Graphics g) {
if(x == 0 && y == 0) {
}
else {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
Iterator it = merker.entrySet().iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
Point mitte = (Point)entry.getKey();
float mp_x = (float) mitte.x;
float mp_y = (float) mitte.y;
int typ = (Integer)entry.getValue();
if(typ == 0) {
Ellipse2D.Float punkt = new Ellipse2D.Float(mp_x,mp_y,14.0f,14.0f);
g2.setColor(new Color(0,0,0));
g2.fill(punkt);
}
if(typ == 1) {
Ellipse2D.Float kreis = new Ellipse2D.Float(mp_x,mp_y,13.0f,13.0f);
g2.setColor(new Color(0,0,0));
g2.setStroke(new BasicStroke(2.0f));
g2.draw(kreis);
}
if(typ == 3) {
g2.setStroke(new BasicStroke(3.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
g2.setColor(new Color(0,0,0));
g2.drawLine(mitte.x+4,mitte.y+4,mitte.x+10,mitte.y+10);
g2.drawLine(mitte.x+4,mitte.y+10,mitte.x+10,mitte.y+4);
}
}
}
}
}
class CheckPoint {
private int mx;
private int my;
CheckPoint() {
}
CheckPoint(int mx, int my) {
mx = mx;
my = my;
if(merker.get(new Point(mx,my)) != null) {
int typ = merker.get(new Point(mx,my));
if(typ == 0) {
merker.put(new Point(mx,my),1);
note = new DrawNote(mx,my);
repaint();
}
if(typ == 1) {
merker.put(new Point(mx,my),3);
note = new DrawNote(mx,my);
repaint();
}
if(typ == 3) {
merker.put(new Point(mx,my),2);
note = new DrawNote(mx,my);
repaint();
}
if(typ == 2) {
merker.remove(new Point(mx,my));
repaint();
}
}
if(merker.get(new Point(mx,my)) == null) {
merker.put(new Point(mx,my),0);
note = new DrawNote(mx,my);
repaint();
}
}
}
class CheckLabel {
private int mx;
private int my;
CheckLabel() {
}
CheckLabel(int mx, int my) {
mx = mx;
my = my;
if(merker.get(new Point(mx,my)) != null) {
int typ = merker.get(new Point(mx,my));
if(typ == 88) {
zeig.setVisible(false);
merker.remove(new Point(mx,my));
}
}
if(merker.get(new Point(mx,my)) == null) {
merker.put(new Point(mx,my),88);
zeig.setVisible(true);
}
}
}
class Maus extends MouseAdapter {
public void mousePressed(MouseEvent me) {
mouse_x = me.getX();
mouse_y = me.getY();
int mx;
if(20 < mouse_y && mouse_y < 70) {
int my = 50;
if((30 < mouse_x && mouse_x < 110)) {
mx = 70;
check = new CheckPoint(mx,my);
}
}
if(90 < mouse_y && mouse_y < 140) {
int my = 100;
if((30 < mouse_x && mouse_x < 110)) {
mx = 50;
checkL = new CheckLabel(mx,my);
}
}
}
}
}
public static void main(String[] args) {
JFrame fenster = new Test();
fenster.setSize(350,275);
fenster.setLocation(200,300);
fenster.setVisible(true);
fenster.setResizable(false);
}
}
Wenn man in den grauen Bereich klickt (Klasse CheckPoint), dann erscheint zuerst ein schwarzer Kreis, beim nächsten Klick dann ein Kreis mit schwarzem Rand, dann ein Kreuz und beim letzten Klick ist alles wieder weg. Funktioniert also, so wie es soll.
Nun brauch ich eine ähnliche Funktionalität für ein Label (liegt im blauen Bereich), nur dass dies nicht mehr über die Paint-Methode geschehen soll, sondern über setVisible true/false. Also hab ich mir gedacht, mach ich das genauso und schreib einfach eine Klasse CheckLabel, die genauso funktioniert wie CheckPoint, nur eben mit dem Unterschied, dass ich jetzt nicht mehr repaint aufrufe, sonder setVisible des Labels auf true bzw. false setze. Und was ist, es funktioniert nicht
Beim ersten Klick wird das Label zwar noch sichtbar, aber beim zweiten Klick verschwindet es nicht mehr.
Was ich daran nicht verstehe ist, dass ich ja eigentlich bei CheckLabel nichts anders gemacht hab, als bei CheckPoint, mal abgesehen vom Aufruf von repaint - brauch ich hier aber auch nicht. Warum wird bei CheckLabel auch noch die Prüfung auf ...== null durchgefhrt (an der muss es ja liegen, da das Label ja wieder erscheint) und bei CheckPoint nicht?
Kann mir von Euch jemand erklären, warum das so ist und mir bei der Lösung meines Problems (Label erscheinen/verschwinden lassen) behilflich sein?
Grüße,
muemmel