Sammeltopic für kurze Codingfragen

Wir sammeln alle Infos der Bonusepisode von Pokémon Karmesin und Purpur für euch!

Zu der Infoseite von „Die Mo-Mo-Manie“
  • java graphics:
    ich zeichne einen kreis und ein rechteck, beide haben eine transparenz von 125/255. das blöde ist, dass die beiden sich an manchen stellen überlappen, und an diesen überlappenden stellen ist es dann dunkler gefärbt als an anderen. kann ich das irgendwie umgehen?


    java mouselistener / mousemotionlistener:
    ich habe ein panel (a), was wieder ein panel (b) und eine scrollbar hat, welche auch ein panel (c) hat. wenn ich in c die maus drücke, und dann in panel a ziehe, ist das mouseDragged event immer noch von panel c. kann ich das irgendwie ändern?


    wie heißen nochmal diese klassen, welche keine objekterzeugung benötigten bzw. wie werden diese initialisert?

  • java graphics:
    ich zeichne einen kreis und ein rechteck, beide haben eine transparenz von 125/255. das blöde ist, dass die beiden sich an manchen stellen überlappen, und an diesen überlappenden stellen ist es dann dunkler gefärbt als an anderen. kann ich das irgendwie umgehen?


    Die einzige Möglichkeit, die mir dazu einfällt wäre die Transparenz von einem der Objekte zu reduzieren oder ganz zu entfernen.


    java mouselistener / mousemotionlistener:
    ich habe ein panel (a), was wieder ein panel (b) und eine scrollbar hat, welche auch ein panel (c) hat. wenn ich in c die maus drücke, und dann in panel a ziehe, ist das mouseDragged event immer noch von panel c. kann ich das irgendwie ändern?


    Java
    panelA.addMouseMotionListener(this);


    wie heißen nochmal diese klassen, welche keine objekterzeugung benötigten bzw. wie werden diese initialisert?


    Abstrakte Klassen können nicht als Objekte instanziiert werden.

  • Zitat von »Qayokm«
    java graphics:
    ich zeichne einen kreis und ein rechteck, beide haben eine transparenz von 125/255. das blöde ist, dass die beiden sich an manchen stellen überlappen, und an diesen überlappenden stellen ist es dann dunkler gefärbt als an anderen. kann ich das irgendwie umgehen?



    Die einzige Möglichkeit, die mir dazu einfällt wäre die Transparenz von einem der Objekte zu reduzieren oder ganz zu entfernen.


    hm, die möglichkeit gefällt mir nicht wirklich :D :D



    das ist nicht mein Problem. Wenn ich auf Panel a klicke, dann reagiert das auch auf die Maus. Wenn ich jetzt aber auf Panel C klicke, und dann gedrückte halte und die Maus in Panel C ziehe, ist die MouseDragged-Methode von Panel C ausgelöst und damit sind auch die Koordinaten in Abhängigkeit von C. Dh ich kriege zum Beispiel als Koordinaten meiner Maus -100,20, ich würde aber lieber 150,20 (Beispielwerte), also dass die Koordinaten abhängig von der linken oberen Ecke des Panels C berechnet werden und nicht von der von A.


    Zitat von »Qayokm«
    wie heißen nochmal diese klassen, welche keine objekterzeugung benötigten bzw. wie werden diese initialisert?



    Abstrakte Klassen können nicht als Objekte instanziiert werden.


    die meine ich eigentlich nicht...


    Zitat von »Qayokm«
    wie heißen nochmal diese klassen, welche keine objekterzeugung benötigten bzw. wie werden diese initialisert?



    Meinst du Methoden? Das sind statische Methoden und die werden über die Klasse und nicht über das Objekt aufgerufen.


    ja, das kann sein. ^^


    ich habe jetzt gerade noch ein problem^^
    ich möchte ein array clonen, im dem clon etwas ändern, und später entweder das original mit dem clon überschreiben oder nicht. jetzt habe ich natürlich zuerst an die .clone() methode gedacht, die erweist sich allerdings als nicht funktionierend für mich, wahrscheinlich weil die refernenzen auf die werte im array noch die gleichen sind. gibt es da schon etwas vorgeschriebenes, was mir ein array gibt, an dem ich etwas ändern kann, ohne das original zu ändern oder muss ich selber das gesamte array mit clone durchgehen und dann jeden einzelnen eintrag clonen?


  • ich habe jetzt gerade noch ein problem^^
    ich möchte ein array clonen, im dem clon etwas ändern, und später entweder das original mit dem clon überschreiben oder nicht. jetzt habe ich natürlich zuerst an die .clone() methode gedacht, die erweist sich allerdings als nicht funktionierend für mich, wahrscheinlich weil die refernenzen auf die werte im array noch die gleichen sind. gibt es da schon etwas vorgeschriebenes, was mir ein array gibt, an dem ich etwas ändern kann, ohne das original zu ändern oder muss ich selber das gesamte array mit clone durchgehen und dann jeden einzelnen eintrag clonen?


    Wenn du ein Array mit der clone()-Methode klonst, wird für das geklonte Array eine eigene Referenz erstellt. Eine Änderung von den Werten der Kopie würde das Original demzufolge nicht beeinflussen.


  • hm komisch, ich habe es eigentlich genauso...



    Java
    Color[][] spielfeldCopy = spielfeld.clone(); 
          spielfeld[0][0]=Color.BLUE;
          spielfeldCopy[0][0]=Color.GREEN;
          System.out.println(""+spielfeld[0][0]+","+spielfeldCopy[0][0]); 
    //Ausgabe: java.awt.Color[r=0,g=255,b=0],java.awt.Color[r=0,g=255,b=0]


    wie man sieht also genau das gleiche...


    e:// und dann nochmal zum transparenzproblem:
    Ist es möglich, alle Pixel auf einem Graphics-Object auf einen gewissen Transparenzwert zu setzen? (außer mit 2 for-schleifen pixel für pixel abzugehen) ich hatte mir gedacht, dass ich den transparenten teil auf das grafikobjekt eines BufferedImages male und dann das BufferedImage auf mein richtiges Grafikobjekt. Wenn es dann das gibt, wonach ich frage, wäre das Problem gelöst^^

  • hm komisch, ich habe es eigentlich genauso...



    Java
    Color[][] spielfeldCopy = spielfeld.clone();       spielfeld[0][0]=Color.BLUE;      spielfeldCopy[0][0]=Color.GREEN;      System.out.println(""+spielfeld[0][0]+","+spielfeldCopy[0][0]); //Ausgabe: java.awt.Color[r=0,g=255,b=0],java.awt.Color[r=0,g=255,b=0]


    wie man sieht also genau das gleiche...


    Ja, in meinem Beispiel verwende ich auch ein eindimensionales Array. Zweidimensionale Arrays werden in Java aber als Array eines Arrays repräsentiert, um die zweite Dimension auch noch zu klonen musst du die Werte des eindimensionalen Arrays noch einmal Stück für Stück durchgehen und einzeln clone() anwenden. System.arraycopy() eignet sich dafür sogar noch besser.


    Java
    public void copyArray(int[][] source, int[][] destination) {
    	for (int i = 0; i < source.length; i++) {
    		System.arraycopy(source[i], 0, destination[i], 0, source[i].length);
    	}
    }



    e:// und dann nochmal zum transparenzproblem:
    Ist es möglich, alle Pixel auf einem Graphics-Object auf einen gewissen Transparenzwert zu setzen? (außer mit 2 for-schleifen pixel für pixel abzugehen) ich hatte mir gedacht, dass ich den transparenten teil auf das grafikobjekt eines BufferedImages male und dann das BufferedImage auf mein richtiges Grafikobjekt. Wenn es dann das gibt, wonach ich frage, wäre das Problem gelöst^^


    Ich glaube du müsstest das für alle Pixel einzeln mit setRGB() machen (also mit zwei verschachtelten Schleifen). Ob deine Variante so funktioniert, kann ich nicht sagen. Hast du sie denn mal ausprobiert?

  • ah ok thx, das mit arraycopy funktioniert. allerdings, wenn ich, nachdem ich den clon erzeugt habe, das original auf den wert des clons setzen will, funktioniert das irgendwie nicht... eigentlich müsste da doch

    Java
    original=clon;

    ausreichen oder? ich habe es auch mit

    Java
    original=clon.clone();

    ausprobiert, hat aber auch nicht geklappt... e:// und jetzt gerade auch noch mit arraycopy, aber nicht funktionert...


    ja, an sich hat das mit dem setzen des transparentwertes funktioniert, das blöde war nur, dass ich irgendwie den hintergrund nicht transparent hinbekommen habe, sodass man immer das quadratische bufferedImage gesehen hat, welches ich auf das graphics-objekt gezeichnet habe... an sich müsste doch eigentlich für einen transparenten hintergrund

    Java
    g.setColor(new Color(255,255,255,0)); //wobei eigentlich nur der Transparentwert wichtig ist
    g.fillRect(0,0,getWidth(),getHeight());


    das reichen oder?

  • ah ok thx, das mit arraycopy funktioniert. allerdings, wenn ich, nachdem ich den clon erzeugt habe, das original auf den wert des clons setzen will, funktioniert das irgendwie nicht... eigentlich müsste da doch

    Java
    original=clon;

    ausreichen oder? ich habe es auch mit

    Java
    original=clon.clone();

    ausprobiert, hat aber auch nicht geklappt... e:// und jetzt gerade auch noch mit arraycopy, aber nicht funktionert...


    Hast du auch mal meine copyArray()-Methode ausprobiert? Mit der sollte das eigentlich wie gewollt klappen.



    ja, an sich hat das mit dem setzen des transparentwertes funktioniert, das blöde war nur, dass ich irgendwie den hintergrund nicht transparent hinbekommen habe, sodass man immer das quadratische bufferedImage gesehen hat, welches ich auf das graphics-objekt gezeichnet habe... an sich müsste doch eigentlich für einen transparenten hintergrund

    Java
    g.setColor(new Color(255,255,255,0)); //wobei eigentlich nur der Transparentwert wichtig ist
    g.fillRect(0,0,getWidth(),getHeight());


    das reichen oder?


    Die Hintergrundfarbe legst du mit setBackground() fest

  • Oh cool, setBackground(), merk ich mir ^^
    Aber trotzdem müsste meins doch auch gehen oder?!


    Ich habe deine methode eigentlich 1:1 übernommen, sie nur nicht als extramethode gemacht, sondern die parameter direkt mit den variablen überschrieben, die ich brauche

  • Oh cool, setBackground(), merk ich mir ^^
    Aber trotzdem müsste meins doch auch gehen oder?!


    Du tust nicht den Hintergrund transparent machen, sondern zeichnest ein transparentes Rechteck über das ganze Panel. Ist halt etwas unsauber, aber dürfte deswegen trotzdem in diesem Fall funktionieren.



    Ich habe deine methode eigentlich 1:1 übernommen, sie nur nicht als extramethode gemacht, sondern die parameter direkt mit den variablen überschrieben, die ich brauche


    Zeig mal bitte deinen kompletten Code.

  • die setBackground() methode gibt es nur bei Graphics2D, ich nutze aber Graphics.

    Java
    BufferedImage tempImage = new BufferedImage(50,50,BufferedImage.TYPE_INT_RGB);
    Graphics g2=tempImage.createGraphics();
    g2.setColor(new Color(255,255,255,0));
    g2.clearRect(0,0,getWidth(),getHeight());
    g.drawImage(tempImage,xDraggedPos-xClickedVerschiebung,yDraggedPos-yClickedVerschiebung,this); 
    //g ist das Graphicobject des Panels


    Wenn ich das so mache, habe ich kein weißes 100% transparentes Bild auf mein Panel gezeichnet, sondern ein schwarzes. Woran liegt das?


    das mit dem Clone() hat sich erledigt, das hat alles richtig funktioniert, ich habe nur im Code dazwischen nicht den Clone verändert, sondern das Original und danach das Original dann mit dem Clone überschrieben ^^


    e:// thx, hatte nicht gesehen, dass graphics2d von graphics erbt.
    klappt jetzt mit dem transparenten :)

  • die vorerst letzte frage :D :

    java mouselistener / mousemotionlistener:
    ich habe ein panel (a), was wieder ein panel (b) und eine scrollbar hat, welche auch ein panel (c) hat. wenn ich in c die maus drücke, und dann in panel a ziehe, ist das mouseDragged event immer noch von panel c. kann ich das irgendwie ändern?


    um es nochmal konkret an einem beispiel zu erklären: ich drücke in panel c die maus und halte diese dort gedrückt. panel a befindet sich links von panel c. jetzt halte ich die maus gedrückt und ziehe sie in panel a. das mouseEntered-event von panel a wird ausgelöst, außerdem das MouseDragged-event, dieses allerdings von panel c, da ich dort angefangen habe, die maus zu "draggen". frage ich nun also die koordinaten im mouseDragged-event ab, während ich mich in panel a befinde, erhalte ich zum beispiel sowas: x:-100,y:10, dh die koordianten im verhältnis zu panel c. das ist an sich ja gar nicht mal so schlimm, weil ich das über die größe der beiden panels zurückrechnen kann. jetzt ist das problem aber, dass sich panel c in einer scrollpane befindet. Das Problem dabei ist, dass ich, wenn ich auf der senkrechten Scrollbar runterscrolle, eine sehr hohe y-Koordinate erhalte, während ich im Panel a bin, obwohl ich im Verhältnis zur linken oberen Ecke des Panels a gar nicht so weit unten bin (begründet dadurch, dass die ScrollBar nach unten gezogen ist und das Programm deshalb denkt, ich sei weiter unten).
    jetzt zu meiner frage: ist es möglich, die mausposition im verhältnis zur oberen linken ecke des panels a herauszufinden während des mouseDragged-Events von panel c? das muss nicht zwingend über methoden des mouseEvents laufen, ich habe auch schon MouseInfo gefunden, womit ich die absolute Position des Mauszeigers herausfinden kann, allerdings weiß ich ja nicht, wo sich mein Panel befindet. Alternativ würde es auch ausreichen, wenn ich herausfinden könnte, wie weit ich auf panel c gescrollt habe, um das dann umzurechnen.
    ich hoffe, das war jetzt verständlich^^


    curse: danke für deine ganzen tipps!

  • joa, damit kann ich es auf jeden fall realisieren, finde ich aber irgendwie nicht so super^^
    mein panel, um das es geht, liegt nämlich auf einem panel, welches auf einem JFrame liegt, dh um die position der maus auf meinem wunschpanel zu erfragen, muss ich die position des wunschpanels auf dem panel wissen, die position des panels auf dem JFrame und die position des JFrames auf dem gesamten Bildschirm...gibt es da vielleicht noch eine andere möglichkeit?
    sonst müsste ich nämlich entweder meinem panel das JFrame übergeben, damit es dessen koordinaten immer abfragen kann oder das JFrame bei Bewegung die Koordinaten an das Panel übergeben lassen...