JavaFX Canvas и BorderPane

В настоящее время я работаю над проектом в JavaFX, и я делаю GUI с BorderPane. Я успешно создал меню и аккордеон и добавил их на нужные мне позиции (вверху и справа).

Теперь я создал класс, который расширяет Canvas и хочет добавить его в левую часть, но, похоже, он не работает.

Что мне нужно, это приложение, чтобы иметь меню, расширяемые опции справа (аккордеон) и место для рисования изображений на оставшееся пространство (слева).

Кто-нибудь может пролить свет?

Добавляем код!

public class PainelCanvas extends Canvas implements DesenhoCanvas {

    //ATRIBUTOS
    Canvas canvas;

    //CONSTRUTOR
    public PainelCanvas() {
        canvas = new Canvas(400, 400);
        GraphicsContext gc = canvas.getGraphicsContext2D();
        desenhar(gc);
    }

    @Override
    public void desenhar(GraphicsContext gc) {
        gc.setFill(Color.GREEN);
        gc.fillText("adsads", 20, 30);
    }

}

В моем основном классе я создаю объект PainelCanvas и добавляю его в BorderPane.

BorderPane root = new BorderPane();
PainelMenu menu = new PainelMenu();
PainelCanvas canvas = new PainelCanvas();
PainelAccordion painel = new PainelAccordion();

//Definir localização dos vários elementos gráficos
root.setTop(menu);  
root.setLeft(canvas);
root.setRight(painel);

1 ответ

Ваш холст не имеет ширины или высоты, а также содержимого.

Обратите внимание, что вы делаете

public class PainelCanvas extends Canvas ...

а также

PainelCanvas canvas = new PainelCanvas();
// ...
root.setLeft(canvas);

Так PainelCanvas это Canvas и является Canvas вы добавляете в свой BorderPane,

Внутри PainelCanvas ты создаешь другой Canvas:

canvas = new Canvas(400, 400);

и добавьте к нему некоторый контент:

GraphicsContext gc = canvas.getGraphicsContext2D();
// ...
gc.fillText(...);

Но этот холст никогда не добавляется к BorderPane,

Если вы действительно хотите продлить Canvas (не очень рекомендуется) вы должны сделать

public class PainelCanvas extends Canvas implements DesenhoCanvas {
    public PainelCanvas() {
        super(400, 400);
        GraphicsContext gc = this.getGraphicsContext2D();
        desenhar(gc);
    }
    // desenhar(...) method as before
}

Но я предпочитаю не подкласс Node классы, за исключением случаев, когда это действительно необходимо ("агрегация в пользу наследования").

Рекомендуемое решение:

public class PainelCanvas implements DesenhoCanvas {
    private Canvas canvas ;
    public PainelCanvas() {
        canvas = new Canvas(400, 400);
        GraphicsContext gc = canvas.getGraphicsContext2D();
        desenhar(gc);
    }

    // desenhar(...) as before...

    public Node getView() {
        return canvas ;
    }
}

а потом:

root.setLeft(canvas.getView());
Другие вопросы по тегам