В предыдущем руководстве по интеграции JavaFX с платформой NetBeans мы показали, как заменить NetBeans Swing MenuBar элементом управления типа Accordion JavaFX, который мы назвали AccordionMenu. Затем это JavaFX AccordionMenu было добавлено в TopComponent SlideIn платформы NetBeans. Это высвободило значение вертикального пространства, а также обеспечило интерфейс ButtonMenu, который был более удобным для сенсорных дисплеев. Когда это меню не используется, оно автоматически вставляется и сворачивается.
Вы можете найти это руководство здесь: http://netbeans.dzone.com/articles/javafx-accordion-slide-out
Это отлично подходит для дисплеев Kiosk или систем HUD, которые могут нуждаться только во взаимодействии в отдельных случаях, или, возможно, для наземной системы NASA, для которой требуется большая 3D-визуализация. Но как насчет панелей инструментов? В предыдущем уроке мы просто скрывали их, чтобы максимизировать вертикальное пространство. Итак, теперь давайте расширим концепцию Accordion для панелей инструментов. Это просто!
И снова JavaFX является частью решения, поскольку он предоставляет некоторые возможности, которых нет у базовых компонентов Swing, доступных в платформе NetBeans. Чтобы полностью понять и следовать этому уроку, вам нужно начать с предыдущего урока, упомянутого выше. Как указано в этой статье, и снова здесь оба эти учебника развиваются по следующим ссылкам:
http://netbeans.dzone.com/articles/how-integrate-javafx-netbeans
http://netbeans.dzone.com/articles/how-integrate-javafx-netbeans-part2
Эти статьи были написаны Geertjan Wielenga, и станет ясно, что большая часть базового кода для выполнения этой статьи была расширена на примере Geertjan. На самом деле … лучший термин был бы «явно скопирован», но давайте не будем спорить о семантике. Еще раз спасибо Гертьян!
Статьи, похожие на это, которые могут быть полезны, находятся ниже
http://netbeans.dzone.com/articles/javafx-fxml-meets-netbeans
http://netbeans.dzone.com/articles/how-embed-javafx-chart-visual
http://netbeans.dzone.com/articles/how-integrate-javafx-netbeans-part3
http://netbeans.dzone.com/articles/how-integrate-javafx-netbeans-part4
http: //netbeans.dzone. com / article / how-integrate-javafx-netbeans-part5
Все эти статьи слабо связаны между собой в уроке, посвященном объяснению и демонстрации преимуществ интеграции JavaFX в платформу NetBeans.
Мы начнем здесь, предполагая, что вы прошли предыдущий урок, который заменяет MenuBar.
Шаг 1. Скройте панели инструментов по умолчанию:
import org.openide.modules.ModuleInstall;
public class Installer extends ModuleInstall {
@Override
public void restored() {
System.setProperty("netbeans.winsys.no_toolbars", "true");
}
}
Шаг 2. Создайте «AccordionToolbar» с помощью JavaFX.
Мы будем использовать шаблон, аналогичный AccordionMenu из предыдущего урока, за исключением гораздо более простого. Фактически мы можем полностью использовать методы buildToolBarStructure () и getInputStream () из учебного пособия по инструментальной панели Geertjan. Однако нам нужно иметь собственный рабочий процесс createScene (), который больше похож на упрощенную версию AccordionMenu. Основной алгоритм таков:
Создайте компонент, расширяющий JFXPanel. Реализуйте
стандартный шаблон Platform.runLater () для создания
цикла сцены JavaFX
через каждый объект файла верхнего уровня в папке «Панели инструментов» файловой системы приложения:
Создайте JavaFX TitledPane для каждого файлового объекта.
Создайте JavaFX ToolBar для каждого TitledPane.
Добавьте элементы ButtonMenu со значками и действиями
на панель
инструментов. Добавьте ToolBar в TitledPane.
Добавьте TitledPane в компонент JavaBX VBox.
Добавьте VBox на сцену
Компонент JavaFX ToolBar служит заменой 1: 1 для панели инструментов Swing в этом контексте, поэтому здесь нет ничего нового. Однако комбинация JavaFX VBox / TitledPane обеспечивает некоторые новые функциональные возможности благодаря компактному разборному виду с небольшой анимацией. В предыдущем уроке использовалась панель «Аккордеон», но аккордеоны анимированы так, что в данный момент можно увидеть только один сегмент. Комбинация VBox / TitledPane позволяет при желании держать открытыми несколько сегментов, что больше соответствует поведению панелей инструментов.
Ниже приведен код моего класса AccordionToolbar. Вы увидите, где я много позаимствовал из примера Гиртджана и предыдущего учебника AccordionMenu:
import java.awt.image.RenderedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TitledPane;
import javafx.scene.control.ToolBar;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javax.imageio.ImageIO;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.SwingUtilities;
import org.openide.awt.Actions;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.Exceptions;
import org.openide.util.ImageUtilities;
/**
*
* @author SPhillips (King of Australia)
*/
public class AccordionToolbar extends JFXPanel{
public VBox vBoxPane;
public String transparentCSS = "-fx-background-color: rgba(0,100,100,0.1);";
public AccordionToolbar() {
super();
this.setBorder(null);
// create JavaFX scene
Platform.setImplicitExit(false);
Platform.runLater(new Runnable() {
@Override
public void run() {
createScene(); //Standard Swing Interop Pattern
}
});
}
private void createScene() {
FileObject toolbarsFolder = FileUtil.getConfigFile("Toolbars");
FileObject[] toolbarKids = toolbarsFolder.getChildren();
//for each toolbar folder need to create a TilePane and add it to an Accordion
List<TitledPane> titledPaneList = new ArrayList<>();
for (FileObject toolbarKid : FileUtil.getOrder(Arrays.asList(toolbarKids), true)) {
ToolBar newToolbarFromFileObject = new ToolBar();
//Blatently ripped off from Geertjan's example, similar to the MenuBar example
try {
buildToolBarStructure(toolbarKid, newToolbarFromFileObject);
} catch (FileNotFoundException ex) {
Exceptions.printStackTrace(ex);
}
//The new toolbar can be added directly to the TitledPane
TitledPane newTitledPaneFromFileObject = new TitledPane(toolbarKid.getName(), newToolbarFromFileObject );
newTitledPaneFromFileObject.setAnimated(true);
newTitledPaneFromFileObject.setStyle(transparentCSS);
titledPaneList.add(newTitledPaneFromFileObject);
}
Group g = new Group();
Scene scene = new Scene(g, 400, 400,new Color(0.0,0.0,0.0,0.0));
scene.setFill(null);
g.setStyle(transparentCSS);
//Instead of an Accordion... a custom VBox allows us to leave sections expanded
vBoxPane = new VBox();
vBoxPane.setStyle(transparentCSS);
vBoxPane.setFillWidth(true);
vBoxPane.getChildren().addAll(titledPaneList);
g.getChildren().add(vBoxPane);
setScene(scene);
validate();
this.setOpaque(true);
this.setBackground(new java.awt.Color(0.0f, 0.0f, 0.0f, 0.0f));
}
private static void buildToolBarStructure(FileObject oneMainToolBarKid, ToolBar newToolbarFromFileObject) throws FileNotFoundException {
for (FileObject oneSecondLevelToolBarKid : oneMainToolBarKid.getChildren()) {
final Action instanceObj =
FileUtil.getConfigObject(
oneSecondLevelToolBarKid.getPath(),
Action.class);
//Name stuff:
String name = (String) instanceObj.getValue(Action.NAME);
String cutAmpersand = Actions.cutAmpersand(name);
//Icon stuff:
Icon icon = (Icon) instanceObj.getValue(Action.SMALL_ICON);
ImageView iv = new ImageView();
//Optionally, include the name in the button:
//Button toolbarButton = new Button(cutAmpersand);
Button toolbarButton = new Button();
if (icon != null) {
java.awt.Image awtImage = ImageUtilities.icon2Image(icon);
Image image = new Image(getInputStream(awtImage));
iv.setImage(image);
toolbarButton.setGraphic(iv);
}
toolbarButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent t) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
java.awt.event.ActionEvent event =
new java.awt.event.ActionEvent(
t.getSource(),
t.hashCode(),
t.toString());
instanceObj.actionPerformed(event);
}
});
} catch (InterruptedException ex) {
Exceptions.printStackTrace(ex);
} catch (InvocationTargetException ex) {
Exceptions.printStackTrace(ex);
}
}
});
newToolbarFromFileObject.getItems().add(toolbarButton);
}
}
private static InputStream getInputStream(java.awt.Image image) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
InputStream fis = null;
try {
ImageIO.write((RenderedImage) image, "png", os);
fis = new ByteArrayInputStream(os.toByteArray());
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
return fis;
}
}
Шаг 3. Создайте слайд в TopComponent для нового AccordionToolbar.
Как и в учебном курсе AccordionMenu, теперь вы можете добавить свой компонент AccordionToolbar в слайд TopComponent. Теперь, когда у вас есть компонент JFXPanel Swing Interop, ваш TopComponent платформы NetBeans не должен знать о JavaFX. Воспользуйтесь мастером окон и выберите «Скольжение влево» в качестве режима. Я бы также посоветовал сделать этот компонент закрытым, иначе пользователь может потерять возможность использовать панель инструментов. Вот аннотации и код конструктора в моем TopComponent:
@ConvertAsProperties(
dtd = "-//javafxwizard.jfxtool//SlidingAccordionToolbar//EN",
autostore = false)
@TopComponent.Description(
preferredID = "SlidingAccordionToolbarTopComponent",
//iconBase="SET/PATH/TO/ICON/HERE",
persistenceType = TopComponent.PERSISTENCE_ALWAYS)
@TopComponent.Registration(mode = "leftSlidingSide", openAtStartup = true)
@ActionID(category = "Window", id = "javafxwizard.jfxtool.SlidingAccordionToolbarTopComponent")
@ActionReference(path = "Menu/JavaFX" /*, position = 333 */)
@TopComponent.OpenActionRegistration(
displayName = "#CTL_SlidingAccordionToolbarAction",
preferredID = "SlidingAccordionToolbarTopComponent")
@Messages({
"CTL_SlidingAccordionToolbarAction=SlidingAccordionToolbar",
"CTL_SlidingAccordionToolbarTopComponent=Accordion Toolbar",
"HINT_SlidingAccordionToolbarTopComponent=A Sliding Accordion Toolbar"
})
public final class SlidingAccordionToolbarTopComponent extends TopComponent {
public AccordionToolbar accordionToolbar;
public SlidingAccordionToolbarTopComponent() {
initComponents();
setName(Bundle.CTL_SlidingAccordionToolbarTopComponent());
setToolTipText(Bundle.HINT_SlidingAccordionToolbarTopComponent());
putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE);
putClientProperty(TopComponent.PROP_UNDOCKING_DISABLED, Boolean.TRUE);
putClientProperty(TopComponent.PROP_KEEP_PREFERRED_SIZE_WHEN_SLIDED_IN, Boolean.TRUE);
setLayout(new BorderLayout());
//Standard JFXPanel Swing Interop Pattern
accordionToolbar = new AccordionToolbar();
//transparency
Color transparent = new Color(0.0f, 0.0f, 0.0f, 0.0f);
accordionToolbar.setOpaque(true);
accordionToolbar.setBackground(transparent);
this.add(accordionToolbar);
this.setOpaque(true);
this.setBackground(transparent);
this.setBorder(null);
}
Шаг 4. Посмотрите, как это здорово выглядит
Теперь у нас есть выдвижная панель инструментов приложения, предоставляемая компонентами JavaFX. Эти компоненты могут быть «оформлены» с помощью стилей CSS, и поэтому меню может быть создано по-разному для разных приложений. Новый AccordionToolbar был разработан таким образом, чтобы несколько панелей инструментов могли отображаться одновременно или не отображаться вообще.
В сочетании с AccordionMenu вы получите красивый слайд в рабочей области на основе и должен выглядеть примерно так: