Javafx Treeview клеточная фабрика с гридпаном -- java поле с участием javafx поле с участием treeview поле с участием gridpane пол Связанный проблема

Javafx treeview cell factory with gridpane


2
vote

проблема

русский

У меня есть <код> TreeView<GridPane> и <код> GridPane содержит несколько узлов, таких как кнопки и метки. Количество узлов внутри <Код> GridPane варьируется.

Мне нужна ячейка, чтобы получить <код> MouseEntered событие, но когда я использую код ниже, то содержимое не отображается.

Мой текущий код выглядит так:

 <код> treeView.setCellFactory(tv -> {     TreeCell<GridPane> cell = new TreeCell<GridPane>() {         @Override         protected void updateItem(GridPane item, boolean empty) {             super.updateItem(item, empty);         }     };      cell.setOnMouseEntered(e -> {         //TODO     });      return cell ; });   

Я знаю, что updateItem метод должен быть изменен, но я не знаю, как потому, что количество узлов внутри <код> GridPane варьируется.

Редактировать Вот классы.

treecontroller.java:

 <код> import java.awt.Canvas; import java.awt.Dimension; import java.awt.GraphicsConfiguration; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent;  import javax.swing.JFrame;  import org.lwjgl.LWJGLException; import org.lwjgl.Sys; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode;  import static org.lwjgl.util.glu.GLU.*; import static org.lwjgl.opengl.GL11.*;  public class GameMain {     public JFrame frame;     public Canvas canvas;      public boolean initialize(int width, int height) {         try {             Canvas canvas = new Canvas();             JFrame frame = new JFrame("Open Rock Raiders - Delta");             this.canvas = canvas;             this.frame = frame;             ComponentAdapter adapter = new ComponentAdapter() {                 public void componentResized(ComponentEvent e) {                     resize();                 }             };              canvas.addComponentListener(adapter);             canvas.setIgnoreRepaint(true);             frame.setSize(640, 480);             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);             frame.getContentPane().add(canvas);             frame.setVisible(true);             Dimension dim = this.canvas.getSize();              Display.setLocation(100, 100);             Display.setTitle("GL Window");             Display.setDisplayMode(new DisplayMode(dim.width, dim.height));             Display.setParent(canvas);             Display.create();              //openGL setup             glViewport(0, 0, dim.width, dim.height);             glMatrixMode(GL_PROJECTION);             glLoadIdentity();             gluPerspective(60.0f, (float)(dim.width/dim.height), 0.1f, 10000.0f);             glMatrixMode(GL_MODELVIEW);             glClearColor(94.0f/255.0f, 161.0f/255.0f, 255.0f/255.0f, 0.5f);             glClearDepth(1.0);             glShadeModel(GL_FLAT);             glEnable(GL_DEPTH_TEST);             glDepthFunc(GL_LEQUAL);             glEnable(GL11.GL_CULL_FACE);              glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);             glEnable(GL_BLEND);             glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);         } catch (LWJGLException le) {             le.printStackTrace();         }         return false;     }      public void resize()     {         Dimension dim = this.canvas.getSize();         GL11.glViewport(0, 0, dim.width, dim.height);     } } 0  

mainclass.java:

 <код> import java.awt.Canvas; import java.awt.Dimension; import java.awt.GraphicsConfiguration; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent;  import javax.swing.JFrame;  import org.lwjgl.LWJGLException; import org.lwjgl.Sys; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode;  import static org.lwjgl.util.glu.GLU.*; import static org.lwjgl.opengl.GL11.*;  public class GameMain {     public JFrame frame;     public Canvas canvas;      public boolean initialize(int width, int height) {         try {             Canvas canvas = new Canvas();             JFrame frame = new JFrame("Open Rock Raiders - Delta");             this.canvas = canvas;             this.frame = frame;             ComponentAdapter adapter = new ComponentAdapter() {                 public void componentResized(ComponentEvent e) {                     resize();                 }             };              canvas.addComponentListener(adapter);             canvas.setIgnoreRepaint(true);             frame.setSize(640, 480);             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);             frame.getContentPane().add(canvas);             frame.setVisible(true);             Dimension dim = this.canvas.getSize();              Display.setLocation(100, 100);             Display.setTitle("GL Window");             Display.setDisplayMode(new DisplayMode(dim.width, dim.height));             Display.setParent(canvas);             Display.create();              //openGL setup             glViewport(0, 0, dim.width, dim.height);             glMatrixMode(GL_PROJECTION);             glLoadIdentity();             gluPerspective(60.0f, (float)(dim.width/dim.height), 0.1f, 10000.0f);             glMatrixMode(GL_MODELVIEW);             glClearColor(94.0f/255.0f, 161.0f/255.0f, 255.0f/255.0f, 0.5f);             glClearDepth(1.0);             glShadeModel(GL_FLAT);             glEnable(GL_DEPTH_TEST);             glDepthFunc(GL_LEQUAL);             glEnable(GL11.GL_CULL_FACE);              glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);             glEnable(GL_BLEND);             glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);         } catch (LWJGLException le) {             le.printStackTrace();         }         return false;     }      public void resize()     {         Dimension dim = this.canvas.getSize();         GL11.glViewport(0, 0, dim.width, dim.height);     } } 1  

treecontroller.fxml:

 <код> import java.awt.Canvas; import java.awt.Dimension; import java.awt.GraphicsConfiguration; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent;  import javax.swing.JFrame;  import org.lwjgl.LWJGLException; import org.lwjgl.Sys; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode;  import static org.lwjgl.util.glu.GLU.*; import static org.lwjgl.opengl.GL11.*;  public class GameMain {     public JFrame frame;     public Canvas canvas;      public boolean initialize(int width, int height) {         try {             Canvas canvas = new Canvas();             JFrame frame = new JFrame("Open Rock Raiders - Delta");             this.canvas = canvas;             this.frame = frame;             ComponentAdapter adapter = new ComponentAdapter() {                 public void componentResized(ComponentEvent e) {                     resize();                 }             };              canvas.addComponentListener(adapter);             canvas.setIgnoreRepaint(true);             frame.setSize(640, 480);             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);             frame.getContentPane().add(canvas);             frame.setVisible(true);             Dimension dim = this.canvas.getSize();              Display.setLocation(100, 100);             Display.setTitle("GL Window");             Display.setDisplayMode(new DisplayMode(dim.width, dim.height));             Display.setParent(canvas);             Display.create();              //openGL setup             glViewport(0, 0, dim.width, dim.height);             glMatrixMode(GL_PROJECTION);             glLoadIdentity();             gluPerspective(60.0f, (float)(dim.width/dim.height), 0.1f, 10000.0f);             glMatrixMode(GL_MODELVIEW);             glClearColor(94.0f/255.0f, 161.0f/255.0f, 255.0f/255.0f, 0.5f);             glClearDepth(1.0);             glShadeModel(GL_FLAT);             glEnable(GL_DEPTH_TEST);             glDepthFunc(GL_LEQUAL);             glEnable(GL11.GL_CULL_FACE);              glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);             glEnable(GL_BLEND);             glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);         } catch (LWJGLException le) {             le.printStackTrace();         }         return false;     }      public void resize()     {         Dimension dim = this.canvas.getSize();         GL11.glViewport(0, 0, dim.width, dim.height);     } } 2  
Английский оригинал

I have a TreeView<GridPane> and the GridPane contains multiple Nodes like Buttons and Labels. The amount of nodes inside the GridPane varies.

I need the cell factory to get the MouseEntered event but when I use the code below then no content gets displayed.

My current code looks like that:

treeView.setCellFactory(tv -> {     TreeCell<GridPane> cell = new TreeCell<GridPane>() {         @Override         protected void updateItem(GridPane item, boolean empty) {             super.updateItem(item, empty);         }     };      cell.setOnMouseEntered(e -> {         //TODO     });      return cell ; }); 

I know that the updateItem method needs to be modified but I dont know how because the number of nodes inside the GridPane varies.

EDIT Here are the classes.

TreeController.java:

public class TreeController {      private TreeItem<GridPane> rootItem;     private int hgap = 5;      @FXML private TreeView<GridPane> treeView;      @FXML     private void initialize() {          GridPane gp = new GridPane();         gp.add(new Label("Label1"), 0, 0);         gp.getColumnConstraints().add(0, new ColumnConstraints());         gp.getColumnConstraints().get(0).setHgrow(Priority.NEVER);          Button cond = new Button("button");         gp.add(cond, 1, 0);         gp.getColumnConstraints().add(1, new ColumnConstraints());         gp.getColumnConstraints().get(1).setHgrow(Priority.NEVER);           gp.add(new Label("Label2"), 2, 0);         gp.getColumnConstraints().add(2, new ColumnConstraints());         gp.getColumnConstraints().get(2).setHgrow(Priority.ALWAYS);          Button btnAdd = new Button("Add");         gp.add(btnAdd, 3, 0);         gp.setHgap(hgap);          rootItem = new TreeItem<GridPane>(gp);         rootItem.setExpanded(true);          treeView.setRoot(rootItem);          rootItem.getChildren().add(new TreeItem<GridPane>(createGridRow("Age", false)));         rootItem.getChildren().add(new TreeItem<GridPane>(createGridRow("Person", true)));          /*         treeView.setCellFactory(tv -> {             TreeCell<GridPane> cell = new TreeCell<GridPane>() {                 @Override                 protected void updateItem(GridPane item, boolean empty) {                     super.updateItem(item, empty);                 }             };              cell.setOnMouseEntered(e -> {                 System.out.println("changed cell");             });              return cell ;         });         */     }      private GridPane createGridRow(String selectedCol, Boolean showAddButton) {         int index = 0;         GridPane gp = new GridPane();          Button columnName = new Button(selectedCol);         gp.add(columnName, index, 0);         gp.getColumnConstraints().add(index, new ColumnConstraints());         gp.getColumnConstraints().get(index).setHgrow(Priority.NEVER);         index++;          Button condition = new Button("greater than");         gp.add(condition, index, 0);         gp.getColumnConstraints().add(index, new ColumnConstraints());         gp.getColumnConstraints().get(index).setHgrow(Priority.NEVER);         index++;           Button value = new Button("[enter value]");         gp.add(value, index, 0);         gp.getColumnConstraints().add(index, new ColumnConstraints());         gp.getColumnConstraints().get(index).setHgrow(Priority.ALWAYS);         index++;          if (showAddButton) {             Button btnAdd = new Button("Add");             gp.add(btnAdd, index, 0);             gp.getColumnConstraints().add(index, new ColumnConstraints());             gp.getColumnConstraints().get(index).setHgrow(Priority.NEVER);             index++;         }          gp.setHgap(hgap);          return gp;     }  } 

MainClass.java:

public class MainClass extends Application{      public static void main(String[] args) {         launch(args);     }      @Override     public void start(Stage stage) {         Parent root;         try {             TreeController controller = new TreeController();              FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("TreeController.fxml"));             fxmlLoader.setController(controller);             root = fxmlLoader.load();              Scene scene = new Scene(root, 600, 500);              stage.setMinHeight(400);             stage.setMinWidth(500);             stage.setTitle("TreeController");             stage.setScene(scene);             stage.setResizable(true);             stage.show();         } catch (IOException e) {             e.printStackTrace();         };         }      @Override     public void stop() {         System.exit(0);     }  } 

TreeController.fxml:

<?xml version="1.0" encoding="UTF-8"?>  <?import javafx.scene.control.ScrollPane?> <?import javafx.scene.control.TreeView?> <?import javafx.scene.layout.AnchorPane?>   <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0"     prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.161" xmlns:fx="http://javafx.com/fxml/1">    <children>       <ScrollPane fitToHeight="true" fitToWidth="true" layoutX="155.0" layoutY="111.0" prefHeight="200.0" prefWidth="200.0"     AnchorPane.bottomAnchor="20.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="20.0">          <content>             <TreeView fx:id="treeView" prefHeight="200.0" prefWidth="200.0" />          </content>       </ScrollPane>    </children> </AnchorPane> 
</div
           
         
         

Список ответов

2
 
vote
vote
Лучший ответ
 

Это довольно простой, но всеобъемлющий пример. После анализа его вы должны быть в состоянии реализовать ваше решение.

 <код> import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.TreeCell; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage;  public class TreeViewCellApp extends Application {      public static void main(String[] args) {         launch(args);     }      @Override     public void start(Stage stage) throws Exception {         TreeItem<Employee> leaf1Item = new TreeItem<Employee>(new Employee("Anne Burnes", "Employee"));         TreeItem<Employee> leaf2Item = new TreeItem<Employee>(new Employee("Ronan Jackson", "Employee"));          TreeItem<Employee> rootItem = new TreeItem<Employee>(new Employee("Jack Shields", "Head"));         rootItem.getChildren().add(leaf1Item);         rootItem.getChildren().add(leaf2Item);          Label label = new Label();          TreeView<Employee> treeView = new TreeView<>(rootItem);         treeView.setCellFactory(param -> new TreeCell<Employee>() {             @Override             protected void updateItem(Employee employee, boolean empty) {                 super.updateItem(employee, empty);                 if (employee == null || empty) {                     setGraphic(null);                 } else {                     EmployeeControl employeeControl = new EmployeeControl(employee);                     employeeControl.setOnMouseClicked(mouseEvent -> label.setText(employee.getName()));                     setGraphic(employeeControl);                 }             }         });          VBox vBox = new VBox(label, treeView);          stage.setScene(new Scene(vBox));         stage.show();     } }  class Employee {      private final String name;     private final String capacity;      public Employee(String name, String capacity) {         this.name = name;         this.capacity = capacity;     }      public String getName() {         return name;     }      public String getCapacity() {         return capacity;     } }  class EmployeeControl extends HBox {      private final Label nameLabel = new Label();     private final Label capacityLabel = new Label();      {         getChildren().addAll(nameLabel, capacityLabel);     }      public EmployeeControl(Employee employee) {         nameLabel.setText(employee.getName());         capacityLabel.setText(employee.getCapacity());     } }   
 

This is rather simple but comprehensive example. After analysing it you should be able to implement your solution.

import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.TreeCell; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage;  public class TreeViewCellApp extends Application {      public static void main(String[] args) {         launch(args);     }      @Override     public void start(Stage stage) throws Exception {         TreeItem<Employee> leaf1Item = new TreeItem<Employee>(new Employee("Anne Burnes", "Employee"));         TreeItem<Employee> leaf2Item = new TreeItem<Employee>(new Employee("Ronan Jackson", "Employee"));          TreeItem<Employee> rootItem = new TreeItem<Employee>(new Employee("Jack Shields", "Head"));         rootItem.getChildren().add(leaf1Item);         rootItem.getChildren().add(leaf2Item);          Label label = new Label();          TreeView<Employee> treeView = new TreeView<>(rootItem);         treeView.setCellFactory(param -> new TreeCell<Employee>() {             @Override             protected void updateItem(Employee employee, boolean empty) {                 super.updateItem(employee, empty);                 if (employee == null || empty) {                     setGraphic(null);                 } else {                     EmployeeControl employeeControl = new EmployeeControl(employee);                     employeeControl.setOnMouseClicked(mouseEvent -> label.setText(employee.getName()));                     setGraphic(employeeControl);                 }             }         });          VBox vBox = new VBox(label, treeView);          stage.setScene(new Scene(vBox));         stage.show();     } }  class Employee {      private final String name;     private final String capacity;      public Employee(String name, String capacity) {         this.name = name;         this.capacity = capacity;     }      public String getName() {         return name;     }      public String getCapacity() {         return capacity;     } }  class EmployeeControl extends HBox {      private final Label nameLabel = new Label();     private final Label capacityLabel = new Label();      {         getChildren().addAll(nameLabel, capacityLabel);     }      public EmployeeControl(Employee employee) {         nameLabel.setText(employee.getName());         capacityLabel.setText(employee.getCapacity());     } } 
</div
 
 

Связанный проблема

49  Как извлечь строку между двумя разграничителями [дубликат]  ( How to extract a string between two delimiters ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

0  Чехол для тестирования, где нуль должен быть возвращен с помощью RestController с Mockito Change  ( Testing case where null should be returned using restcontroller with mockito fai ) 
Я хочу проверить корпус NullPointexception, который следует бросить контроллер, который я проверяю, но я всегда получаю ошибку NullPointexception. Я пытаюсь п...

1  Android ListView с некоторыми показанными элементами и показывать больше кнопки  ( Android listview with some items shown and show more button ) 
Я нахожу его трудно искать то, что я ищу, поэтому я думал, что постараюсь объяснить это здесь. В настоящее время у меня есть пользовательский список в ScrollV...

0  Общее утверждение для ошибки recuralandom return - Java  ( General statement for securerandom return error java ) 
Я искал на протяжении разных форумов, и теперь я наконец-то ставит свой вопрос, так как я не могу найти конкретный ответ. Я пишу протокол безопасности для д...

1  Как увеличить предел параллельного соединения OpenFire?  ( How to increase openfire concurrent connection limit ) 
Я пытаюсь проверить, сколько одновременных пользовательских подключений Openfire может обрабатывать. Я заметил предел при 4000 пользователями. Как я могу ...

0  Строка заменить приключение в Java  ( String replace adventure in java ) 
Я пытаюсь добиться этого - если строка содержит шаблон <код> %25 с последующим любое количество альфа-цифровых символов, то мне нужно заменить <код> %25 с <...

1  Кварц Schdeuler для нескольких проектов в JBOSS 5  ( Quartz schdeuler for multiple projects in jboss 5 ) 
Я развернул два проекта (P1 & AMP; P2) в JBOSS 5. Оба проекта настроены с различными кварцевыми планировщиками. Но когда я заплатурую работу на P1, он доступа...

1  Простое Javaee HTML Get / Post Application  ( Simple javaee html get post application ) 
Я просто начинаю с Javaee (я вполне свободно владею в Javase), и у меня возникли проблемы с обездованием моего мозга вокруг всех новых вещей, которые необходи...

1  Обратитесь к веб-странице внутри файла JAR  ( Refer to a web page inside a jar file ) 
У меня есть рабочий проект. Он включает в себя другой проект, который имеет дело с отдыхом как REST-API.jar. Теперь я сделал одностраничное интернет-интерфе...

4  Как полностью квалифицировать класс, имя пакета которого сталкивается с местным именем члена?  ( How to fully qualify a class whose package name collides with a local member nam ) 
ОК, вот очень любопытная языковая головоломка Java 7 для специалистов JLS там. Следующий кусок кода не скомпилируется, ни с Javac, ни с Eclipse: <код> ...

1  Могу ли я нажать на свой собственный объект пользователя в Security SecurityContext?  ( Can i push my own user object into springs securitycontext ) 
Я новичок в весенней безопасности и последовал за некоторыми основными рецептами, чтобы получить весеннюю безопасность, работающую в моем заявлении, но теперь...

-2  В классе F250.java есть две петли, которые не будут работать  ( There are two loops in the f250 java class that wont run ) 
Класс F250.java - это объект оружия, и есть два метода, которые привлекают и обновляют пули, выходящие из пистолета. Я сделал класс пули и сделал массив пули ...

56  Когда использовать явное ожидание против неявного ожидания в Webdriver Selenium?  ( When to use explicit wait vs implicit wait in selenium webdriver ) 
Я использую: <код> driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS); Но он все еще непрерывно не работает для нижеизведанного элемента ...

1  Улучшение моего жадного алгоритма  ( Improving my greedy algorithm ) 
** Это мой код, который выглядит способ найти сумму в массиве ** <код> public class Piecedemonei { public static void recherche(int[] tab) { ...

12  Способ вызова в EJB на jboss запустить [дубликат]  ( Call method in ejb on jboss startup ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

Связанный проблема

49  Как извлечь строку между двумя разграничителями [дубликат] 
0  Чехол для тестирования, где нуль должен быть возвращен с помощью RestController с Mockito Change 
1  Android ListView с некоторыми показанными элементами и показывать больше кнопки 
0  Общее утверждение для ошибки recuralandom return - Java 
1  Как увеличить предел параллельного соединения OpenFire? 
0  Строка заменить приключение в Java 
1  Кварц Schdeuler для нескольких проектов в JBOSS 5 
1  Простое Javaee HTML Get / Post Application 
1  Обратитесь к веб-странице внутри файла JAR 
4  Как полностью квалифицировать класс, имя пакета которого сталкивается с местным именем члена? 
1  Могу ли я нажать на свой собственный объект пользователя в Security SecurityContext? 
-2  В классе F250.java есть две петли, которые не будут работать 
56  Когда использовать явное ожидание против неявного ожидания в Webdriver Selenium? 
1  Улучшение моего жадного алгоритма 
12  Способ вызова в EJB на jboss запустить [дубликат]