BufferStrategy wird nicht gefunden

kodela

Bekanntes Mitglied
Hallo,

in meiner Klasse ChessInOut benötige ich für das Ziehen der Figuren auch "BufferStrategy".

In einer sehr schmalen Testklasse funktioniert das Ziehen der Figuren mit Einsatz von "BufferStrategy"
problemlos. In der Klasse "ChessInOut", die Teil des Gesamtprogramms ist, klappt es dagegen nicht.
"BufferStrategy" wird hier nicht. Die beiden Aufrufe "createBufferStrategy(2);" und "getBufferStrategy();"
werden nicht gefunden.

Hier ein Bild vom Klassenrumpf nur mit den Initialisierungsvorkommen von"createBufferStrategy(2);"
und "getBufferStrategy();":

1586866900786.png
Rechts unten ist ein Screeshot vom Original unter NetBeans. Im gelben Kasten die Fehlermeldung
für createBufferStrategy. Für getBufferStrategy sieht die Fehlermeldung gleich aus.

In meiner Testklasse, bei der alles Funktioniert, habe ich absolut die gleichen Aufbau.

Was könnte für dieses Problem ursächlich sein?
 
Hallo,

in meiner Klasse ChessInOut benötige ich für das Ziehen der Figuren auch "BufferStrategy".

In einer sehr schmalen Testklasse funktioniert das Ziehen der Figuren mit Einsatz von "BufferStrategy"
problemlos. In der Klasse "ChessInOut", die Teil des Gesamtprogramms ist, klappt es dagegen nicht.
"BufferStrategy" wird hier nicht. Die beiden Aufrufe "createBufferStrategy(2);" und "getBufferStrategy();"
werden nicht gefunden.

Hier ein Bild vom Klassenrumpf nur mit den Initialisierungsvorkommen von"createBufferStrategy(2);"
und "getBufferStrategy();":

Anhang anzeigen 13324
Rechts unten ist ein Screeshot vom Original unter NetBeans. Im gelben Kasten die Fehlermeldung
für createBufferStrategy. Für getBufferStrategy sieht die Fehlermeldung gleich aus.

In meiner Testklasse, bei der alles Funktioniert, habe ich absolut die gleichen Aufbau.

Was könnte für dieses Problem ursächlich sein?
Das sind noch nicht implementierten Methoden oder? Das heißt du rufst eine Methode auf die noch gar nicht exisitert in deiner ChessInOut Klasse.
 
createBufferStrategy() und getBufferStrategy() werden z.B. von JFrame (also eigentlich von java.awt.Window) implementiert, nicht von JPanel.

Wie sieht denn die Testklasse aus?
 
Danke für Eure Antworten.
@temi: Dein Gedanke mit JFrame als Basis für BufferStrategy entspricht sehr meinen zwischenzeitlichen Erkenntnissen. Ich habe mal wirklich alles was möglich war aus der Klasse ChessInOut entfernt. Das sieht ähnlich dem aus, was ich zuletzt gezeigt habe. Hier der Restcode, bei dem BufferStrategy immer noch nicht gefunden wird:
Code:
package mychess;

import java.awt.image.BufferStrategy;

public class ChessInOut extends javax.swing.JPanel implements GlobaleObjekte {

    private static final long serialVersionUID = 1L;
    
    private final ChessApp cApp;
    private final ChessBoard cboard;
    
    public ChessInOut(ChessApp mfrm, ChessBoard board){
    
        cApp = mfrm;
        cboard = board;
    
        createBufferStrategy(2);
        strategy = getBufferStrategy();
        
    }
}
Die Figurenbewegung, für die ich BufferStrategy benötige findet aber definitiv nicht in der Hauptklasse sondern in ChessInOut statt. Aber dass von ChessInOut ein Zugriff auf BufferStrategy erfolgt, müsste ja zu machen sein. Mal sehen.

@lam_tr: Hier der Code für die Testklasse:
Code:
/**
 * https://www.tutorials.de/threads/swing-wie-kann-man-ein-bild-mit-der-maus-bewegen-lassen.228807/
 */

import java.awt.Cursor;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.util.concurrent.TimeUnit;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;

/**
 * @author Thomas, modifiziert von kodela
 *
 */
public class MoveableIconExample extends JFrame {

    static int width = 400, height = 300;
    boolean shouldIconMove;
    BufferStrategy strategy;
    BufferedImage image;
    int imageWidth;
    int imageHeight;
    Rectangle rectangle = new Rectangle(200, 150);
    Point p;
    Cursor normalCursor, imageMoveCursor;
    Thread runner = new ThreadImpl();

    // Konstruktor
    public MoveableIconExample() {
        super("MoveableIconExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setSize(width, height);
        setVisible(true);

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (shouldIconMove) {
                    setCursor(Toolkit.getDefaultToolkit().
                            createCustomCursor(new ImageIcon("").
                            getImage(), new Point(0, 0), "No Cursor"));
                    shouldIconMove = true;
                } else
                shouldIconMove = false;
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                p = e.getPoint();
                if (rectangle.contains(p) && shouldIconMove) {
                    setCursor(normalCursor);
                    shouldIconMove = false;
                } else {
                    shouldIconMove = true;
                    setCursor(normalCursor);
                }
            }
        });

        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                p = e.getPoint();
            }
        });

        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                shouldIconMove = true;
                p = e.getPoint();
                if (rectangle.contains(p) && shouldIconMove) {
                    setCursor(imageMoveCursor);

                } else {
                    setCursor(normalCursor);
                }
            }
        });

        createBufferStrategy(2);
        strategy = getBufferStrategy();
        runner.start();
    }

    private class ThreadImpl extends Thread {

        @Override
        public void run() {
            try {
                image = ImageIO.read(new File("src/de/tutorials/bishopw.png"));
//                image = ImageIO.read(getClass().getResource("de//tutorials/bishopw.png"));
                imageWidth = image.getWidth();
                imageHeight = image.getHeight();

                int xPos = 200;
                int yPos = 150;

                rectangle.setLocation(100, 75);

                while (true) {
                    Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
                    g.clearRect(0, 0, width, height);

                    if (shouldIconMove && rectangle.contains(p)) {
                        xPos = p.x - imageWidth / 2;
                        yPos = p.y - imageHeight / 2;
                    }

                    g.drawRect(rectangle.x, rectangle.y, rectangle.width,
                            rectangle.height);
                    g.drawImage(image, xPos, yPos, null);

                    g.dispose();
                    strategy.show();
                    TimeUnit.MILLISECONDS.sleep(20L);
                }

            } catch (Exception e) {
            }
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        MoveableIconExample mIE = new MoveableIconExample();
    }
}
Die von mir verwendete Figur (Läufer) ist im Anhang.
 

Anhänge

  • bishopw.png
    bishopw.png
    3,1 KB · Aufrufe: 1
Dein Gedanke mit JFrame als Basis für BufferStrategy entspricht sehr meinen zwischenzeitlichen Erkenntnissen.

Da braucht es nicht sehr viele Erkenntnisse dazu. Deine Klasse erweitert JPanel.
ChessInOut extends javax.swing.JPanel
Der direkte Aufruf von createBufferStrategy(2); entspricht dem Aufruf einer Methode dieser Klasse. Da weder in deiner Klasse ChessInOut, noch in JPanel diese Methode implementiert ist, kannst du sie auch nicht aufrufen. So einfach ist das.

Edit: Die Testklasse erweiter JFrame, da gibt es diese Methode und man kann sie auch aufrufen.
 
Da weder in deiner Klasse ChessInOut, noch in JPanel diese Methode implementiert ist, kannst du sie auch nicht aufrufen.
Das mit dem Aufruf ist klar. Das Problem ist ja, dass sich BufferStrategy in ChessInOut nicht implementieren lässt. Ich habe jetzt createBufferStrategy(2); in der Hauptklasse aufgerufen und dann inout.strategy = getBufferStrategy(); und damit scheint es zu funktionieren. Es wird zwar die per Mauszeiger zu bewegende Figur noch nicht gezeigt, aber dafür gibt es andere Gründe.
 

Zurück
Oben