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());