2. Контекстно меню (Context Menu)

Контекстното меню в JavaFX представлява специализиран графичен компонент, който предоставя набор от команди, свързани с конкретен визуален елемент или област от потребителския интерфейс. То се визуализира обикновено при щракване с десен бутон на мишката върху даден компонент.

Основното предназначение на контекстното меню е да осигури бърз и локален достъп до действия, които имат отношение към текущия обект, без да е необходимо потребителят да използва основното меню на приложението.

Контекстното меню е част от механизма за взаимодействие между потребителя и графичния интерфейс и следва принципа на контекстно-зависимо управление, при който достъпните команди се определят от избрания елемент или активната област.

1. Предназначение

За разлика от стандартното меню (MenuBar), което съдържа глобални команди за цялото приложение, контекстното меню:

  • е свързано с конкретен компонент;
  • се появява само при определено потребителско действие;
  • съдържа операции, валидни за текущия контекст;
  • подобрява удобството и ефективността при работа с интерфейса.

Типични примери за команди в контекстно меню са:

  • Изрязване
  • Копиране
  • Поставяне
  • Изчистване
  • Изтриване
  • Свойства

2. Основни класове

Реализацията на контекстно меню в JavaFX се базира основно на следните класове:

2.1. ContextMenu

Класът ContextMenu представлява контейнер, който съдържа един или повече елементи от менюто. Той изпълнява ролята на плаващо меню, което се визуализира при взаимодействие с определен компонент.

2.2. MenuItem

Класът MenuItem представя конкретна команда в рамките на контекстното меню. Всеки елемент може да бъде асоцииран с действие, което се изпълнява при избор от потребителя.

2.3. Графичен компонент, към който е свързано менюто

Контекстното меню не съществува самостоятелно в интерфейса, а се асоциира с конкретен визуален компонент, например:

  • TextArea
  • TextField
  • Label
  • TableView
  • ListView

3. Принцип на работа

Контекстното меню функционира по следния начин:

3.1. Създава се обект от тип ContextMenu.

3.2. Към него се добавят един или повече MenuItem.

3.3. Менюто се свързва с конкретен графичен компонент.

3.4. При извършване на контекстно действие от страна на потребителя менюто се визуализира.

3.5. При избор на команда се генерира събитие, което се обработва чрез механизма за обработка на събития в JavaFX.

Този модел е пример за събитийно-ориентирано програмиране, при което действията на потребителя предизвикват изпълнение на предварително дефинирана логика.

4. Реализация

В JavaFX контекстното меню може да бъде дефинирано не само програмно, но и декларативно чрез FXML. Това позволява разделяне на:

  • структурата на интерфейса, описана във FXML;
  • логиката на поведението, реализирана в контролера.
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.ContextMenu?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane xmlns:fx="http://javafx.com/fxml"
            fx:controller="com.example.Controller">
        <TextArea fx:id="textArea" prefHeight="200.0" prefWidth="400.0">
            <contextMenu>
                <ContextMenu>
                    <items>
                        <MenuItem text="Изчисти" onAction="#handleClear"/>
                    </items>
                </ContextMenu>
            </contextMenu>
        </TextArea>
</AnchorPane>
  • AnchorPane изпълнява ролята на коренов контейнер в сцената. В него се разполагат визуалните компоненти на интерфейса.
  • Създава се текстова област, която ще бъде свързана с контекстното меню.
  • Атрибутът fx:id=”textArea” позволява достъп до компонента от контролера.
  • Този елемент дефинира свойството contextMenu на TextArea. Чрез него към компонента се асоциира обект от тип ContextMenu.
  • Създава се контекстното меню като контейнер за команди.
  • Секцията съдържа командите в контекстното меню. В примера е дефиниран един елемент — „Изчисти“.
  • Атрибутът onAction=”#handleClear” свързва избора на този елемент с метод в контролера.

5. Управление в контролера

package bg.tu_varna.sit.ps.lab8.task1.controller;

import javafx.fxml.FXML;
import javafx.scene.control.TextArea;

public class MenuController {

    @FXML
    private TextArea textArea;

    @FXML
    private void handleClear() {
        textArea.clear();
    }
}

Mетодa handleClear се извиква при избор на елемента „Изчисти“ от контекстното меню. Използваният метод clear() премахва цялото съдържание на TextArea.


This site uses Just the Docs, a documentation theme for Jekyll.