transparent geht nicht (btw: rechteck)

teslar

Aktives Mitglied
hi

ich habe ein png bild, bei dem ich mir sehr sicher bin, das es teilweise transparent ist.
habe hier den teilcode:
Java:
jPanelL1 = new javax.swing.JPanel(){
            @Override
        public void paintComponent(Graphics g)
        {
        super.paintComponent(g);
        g.drawImage(spst.getSprite(0).getImage(), 0, 0, null);
        
        }};
        jPanelI.add(jPanelL1);
        jPanelL1.setBounds(14,11,173,70);
        jPanelL1.setBackground(null);

ohne das super.paintComponent(g); funktioniert es, aber mit der zeile wird der hintergrund weis.
ich könnte es einfach weglassen, nur ich weis nicht ob das so gut ist, hab auch gehöhrt man soll das so machen.

kann ich das in diesem fall einfach weglassen?

btw: möchte zudem ein gefülltes rechteck zeichnen, wie macht man das, höhrt sich komisch an aber ich kriegs einfach nicht hin....wie geht das?😳
 
Die paintComponent Methode bestimmt ja überhaupt erst mal, was wie gezeichnet wird.

Da kannst du auch ein Rechteck zeichen.
Du erstellst dir vorher ein Rectangle2D im Code, erstellst dir ein Graphics2D mit Hilfe von g in paintComponent und setzt in der paintComponent Methode
Code:
g.setFill(Color.RED);
, woraufhin du dein Rechteck dann zeichnest. Aber dazu findest du bestimmt viel bei google, such einfach mal nach Rectangle2D oder sowas.
 
danke, soll ich das rechteck im hauptcode oder in paintcomponent machen, weil das ändert sich immer wieder, da is es vllt schlauer das in der paintcomponent methode zu erstellen, oder?

edit: ich versteh die ganzen override methoden nicht, mach ich was falsch oder muss ich die alle ausfüllen?

edit:
so hab ich das jetzt gemacht aber kommt mir komisch vor:
Java:
Rectangle2D l = new Rectangle2D() {

                    @Override
                    public void setRect(double x, double y, double w, double h) {
                        throw new UnsupportedOperationException("Not supported yet.");
                    }

                    @Override
                    public int outcode(double x, double y) {
                        throw new UnsupportedOperationException("Not supported yet.");
                    }


                    @Override
                    public Rectangle2D createUnion(Rectangle2D r) {
                        throw new UnsupportedOperationException("Not supported yet.");
                    }

                    @Override
                    public double getX() {
                        throw new UnsupportedOperationException("Not supported yet.");
                    }

                    @Override
                    public double getY() {
                        throw new UnsupportedOperationException("Not supported yet.");
                    }

                    @Override
                    public double getWidth() {
                        throw new UnsupportedOperationException("Not supported yet.");
                    }

                    @Override
                    public double getHeight() {
                        throw new UnsupportedOperationException("Not supported yet.");
                    }

                    @Override
                    public boolean isEmpty() {
                        throw new UnsupportedOperationException("Not supported yet.");
                    }

                    @Override
                    public Rectangle2D createIntersection(Rectangle2D r) {
                        throw new UnsupportedOperationException("Not supported yet.");
                    }

                };
 
Zuletzt bearbeitet:
Rectangle2D ist abstrakt. Es gibt drei Subklassen: Rectangle, Rectangle2D.Double und Rectangle2D.Float
Nimm eine davon.

Dein eigentliches Problem habe ich übrigens nicht verstanden.
Vielleicht kannst du ja mal dein Bild hochladen und dazu noch Screenshots von der Oberfläche und genauer beschreiben, was du erreichen möchtest.
 
Diese ganzen Methoden brauchst du nur, sofern du eine neue Realisierung von Recatngle2D machen möchtest, wovon ich dir runlischst abrate (wozu auch, für int?). Wie Xehpuk schon gesagt hat, nimm eine der drei existierenden Klassen Rectangle2D.Double oder Float oder einfach nur Rectangle (das dürfte dann int sein, glaub ich).
Also etwas derart:
Java:
Rectangle2D rect = new Rectangle2D.Double(...);
 
also danke erstmal,

was ich machen möchte ist eine lebensanzeige, die sich je nach lebenspunkteanzahl füllt bzw leert.

die umrandung habe ich jetzt, jetz muss ich halt ein dynamisches rechteck machen, habe es auch überlegt, einfach mit einem image zu machen, aber das kostet eigentlich nur unnötig arbeitsspeicher (glaub ich zumindest).
g.fillrect (x,y,z,v)
habe ich folgendes problem:
Java:
jPanelL1 = new javax.swing.JPanel(){
            @Override
        public void paintComponent(Graphics g)
        {
        super.paintComponent(g);
        g.drawImage(spst.getSprite(0).getImage(), 0, 0, null);
        g.fillRect(10, 10, (int)100*(LP2/8000), 50);
        }};
        jPanelI.add(jPanelL1);
        jPanelL1.setOpaque(false);
        jPanelL1.setBounds(14,11,173,70);

ohne die berechnung wird es gezeichnet, mit nicht?, LP2=6000, somit kann es nicht
100*(LP2/8000)=0 sein....
 
Java:
(int)100*(LP2/8000)
Hier steckt das Problem, du machst eine Int-Division. Um das zu Vermeiden, musst du irgendeinen der Operanden explizit in double oder float umwandeln:
Java:
(int)100*(LP2/8000.0)
 
Zuletzt bearbeitet:
ohne die berechnung wird es gezeichnet, mit nicht?, LP2=6000, somit kann es nicht 100*(LP2/8000)=0 sein....
doch die Berechnung liefert 0 als ergebnis, da hier mit Ganzzahlen gerechnet wird ist 6000/8000=0. Warum die Klammern? Lass diese doch einfach weg:
Code:
100*6000/8000
liefert dann das gewünschte (ganzzahlige) Ergebnis.
 
also einfach die klammern wegmachen ist für mich keine lösung, da mit 50lp dann 0 rauskommen wird.

(int)(100*(LP2/8000)) funzt , hab aber noch ein +1 hinzugefügt um mindestens eine breite von 1 zu haben,

mein problem ist hiermit gelöst, danke an alle:applaus:
 
ich habe es ausprobiert und es kam 0 raus,


und ich habe es so angelegt, das bei vollem leben die passende anzahl rauskommt, funzt auch soweit,


aber das mit dem runden wäre auch eine idee
 

Neue Themen


Zurück
Oben