2015-12-29 3 views
2

Я работаю над простым настольным программным обеспечением javaFX, он по существу позволяет пользователю управлять различными источниками света через последовательную связь. Он состоит из трех классов:Динамическое изменение элементов управления JavaFX от других объектов

  • он UI Controller (написано с использованием JavaFX сцены Builder 2.0 и пользовательской библиотекой для материалов типа управления, jfoenix)
  • объекта «Storage» со статическими свойствами (например, когда свет включен, и какой цвет он должен отображать), этот класс должен содержать только статические свойства, так что нет конфликтов с другими объектами, пытающимися изменить некоторые значения. Этого объект также ответствен для последовательной связи (с использованием JSSC)
  • Резьбового объект, который управляет огнями с использованием таймеров

Я должен сказать, что у меня есть рабочее решение, построенное с использованием свинга, но я честно не как это вообще ...

Вот скомпилированный интерфейс: http://imgur.com/esWFsgh

Есть две проблемы:

  • Я хочу т каждая кнопка сверху (например, «barra 1») отображает статус корреспондирующего света, например, если «barra 1» включен, он должен быть зеленым, когда он выключен, он должен быть красным. проблема в том, что я должен создать объект класса контроллера, чтобы получить доступ ко всем кнопкам, но, как и должно быть, в инстанцированном объекте все кнопки исчезли, я должен их воссоздать, и это obivuosly not решение ... что я могу сделать?
  • Это просто, я уже знаю, что мой «слушатель» неверен, но я просто не могу найти ошибку ... как только я перетаскиваю любой из слайдеров, исключение Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: argument type mismatch ... (и есть нет ссылки на какой-либо из моих классов)

Здесь вы можете найти код:

класс хранения

package com.matteoformenti.rgbcontroller; 
 

 
import java.awt.*; 
 

 
/** 
 
* Created by Matteo on 28/12/2015. 
 
*/ 
 
public class Storage 
 
{ 
 
    private static final String ON_COLOR = "#4CAF50"; 
 
    private static final String OFF_COLOR = "#F44336"; 
 

 
    private static Color color; 
 
    private static boolean bars[] = {false, false, false, false, false}; 
 
    private static boolean circles[] = new boolean[2]; 
 
    private static boolean usePot = false; 
 

 
    //-------------------------------------------------------// 
 

 

 
    public static boolean getBarValue(int barNumber) 
 
    { 
 
     return bars[barNumber]; 
 
    } 
 

 
    public static void setAllBars(boolean value) 
 
    { 
 
     for(boolean v : bars) 
 
      v = value; 
 
     setAllBarsColors(); 
 
    } 
 

 
    public static boolean[] getAllBars() 
 
    { 
 
     return bars; 
 
    } 
 

 
    public static void setCircleValue(int circleNumber, boolean value) 
 
    { 
 
     circles[circleNumber-1] = value; 
 
    } 
 

 
    public static boolean getCircleValue(int circleNumber) 
 
    { 
 
     return circles[circleNumber-1]; 
 
    } 
 

 
    public static void setAllCircles(boolean value) 
 
    { 
 
     for(boolean v : circles) 
 
      v = value; 
 
    } 
 

 
    public static boolean[] getAllCircles() 
 
    { 
 
     return circles; 
 
    } 
 

 
    public static void setColor(Color c) 
 
    { 
 
     color = c; 
 
    } 
 

 
    public static void setRed(int red) 
 
    { 
 
     if(red > 255) 
 
      red = 255; 
 
     if(red < 0) 
 
      red = 0; 
 
     int g = color.getGreen(); 
 
     int b = color.getBlue(); 
 
     color = new Color(red, g, b); 
 
    } 
 

 
    public static void setGreen(int green) 
 
    { 
 
     if(green > 255) 
 
      green = 255; 
 
     if(green < 0) 
 
      green = 0; 
 
     int r = color.getRed(); 
 
     int b = color.getBlue(); 
 
     color = new Color(r, green, b); 
 
    } 
 

 
    public static void setBlue(int blue) 
 
    { 
 
     if(blue > 255) 
 
      blue = 255; 
 
     if(blue < 0) 
 
      blue = 0; 
 
     int g = color.getGreen(); 
 
     int r = color.getRed(); 
 
     color = new Color(r, g, blue); 
 
    } 
 

 
    public static void setHue(int h) 
 
    { 
 
     int rgb = Color.HSBtoRGB(h, 100, 100); 
 
     int red = (rgb >> 16) & 0xFF; 
 
     int green = (rgb >> 8) & 0xFF; 
 
     int blue = rgb & 0xFF; 
 
     color = new Color(red, green, blue); 
 
    } 
 

 
    public static void invertBarValue(int i) 
 
    { 
 
     bars[i] = !bars[i]; 
 
     setBarColor(i); 
 
    } 
 
    public static void invertCircleValue(int i) 
 
    { 
 
     circles[i] = !circles[i]; 
 
    } 
 

 
    public static void setBarColor(int i) 
 
    { 
 
     Controller c = new Controller(); 
 
     c.test(); 
 
     /*Controller.bar1.setStyle("-fx-background-color: " + ON_COLOR + ";"); 
 
     if (bars[i] == true) 
 
      Controller.getBarButton(i).setStyle("-fx-background-color: " + ON_COLOR + ";"); 
 
     if (bars[i] == false) 
 
      Controller.getBarButton(i).setStyle("-fx-background-color: " + OFF_COLOR + ";");*/ 
 
    } 
 

 
    public static void setAllBarsColors() 
 
    {/* 
 
     for (int i = 0; i < 5; i++) 
 
     { 
 
      if (bars[i] == true) 
 
       Controller.getBarButton(i + 1).setStyle("-fx-background-color: " + ON_COLOR + ";"); 
 
      if (bars[i] == false) 
 
       Controller.getBarButton(i + 1).setStyle("-fx-background-color: " + OFF_COLOR + ";"); 
 
     }*/ 
 
    } 
 
}

Класс

Контроллер:

package com.matteoformenti.rgbcontroller; 
 

 
import com.jfoenix.controls.JFXButton; 
 
import javafx.event.ActionEvent; 
 
import javafx.fxml.FXML; 
 
import javafx.scene.control.Button; 
 
import javafx.scene.control.ColorPicker; 
 
import javafx.scene.control.Slider; 
 
import javafx.scene.layout.Background; 
 
import javafx.scene.layout.HBox; 
 
import javafx.scene.layout.Pane; 
 

 
import java.awt.*; 
 

 
public class Controller 
 
{ 
 

 
    @FXML 
 
    private JFXButton bar1; 
 

 
    @FXML 
 
    private JFXButton bar2; 
 

 
    @FXML 
 
    private JFXButton bar3; 
 

 
    @FXML 
 
    private JFXButton bar4; 
 

 
    @FXML 
 
    private JFXButton bar5; 
 

 
    @FXML 
 
    private JFXButton circle1; 
 

 
    @FXML 
 
    private JFXButton circle2; 
 

 
    @FXML 
 
    private Slider rSlider; 
 

 
    @FXML 
 
    private Slider gSlider; 
 

 
    @FXML 
 
    private Slider bSlider; 
 

 
    @FXML 
 
    private Slider aSlider; 
 

 
    @FXML 
 
    private JFXButton pot; 
 

 
    @FXML 
 
    private JFXButton stroboBars; 
 

 
    @FXML 
 
    private Button stroboBarsConfig; 
 

 
    @FXML 
 
    private JFXButton stroboCircles; 
 

 
    @FXML 
 
    private Button stroboCirclesConfig; 
 

 
    @FXML 
 
    private JFXButton fadeColors; 
 

 
    @FXML 
 
    private Button fadeColorsConfig; 
 

 
    @FXML 
 
    private ColorPicker colorPicker; 
 

 
    @FXML 
 
    private Pane frame; 
 

 
    public void test() 
 
    { 
 
     bar1.setStyle("-fx-background-color: #33b5e5;"); 
 
    } 
 

 
    @FXML 
 
    void bar1Pressed(ActionEvent event) 
 
    { 
 
     Storage.invertBarValue(0); 
 
    } 
 

 
    @FXML 
 
    void bar2Pressed(ActionEvent event) {Storage.invertBarValue(1);} 
 

 
    @FXML 
 
    void bar3Pressed(ActionEvent event) 
 
    { 
 
     Storage.invertBarValue(2); 
 
    } 
 

 
    @FXML 
 
    void bar4Pressed(ActionEvent event) {Storage.invertBarValue(3);} 
 

 
    @FXML 
 
    void bar5Pressed(ActionEvent event) {Storage.invertBarValue(4);} 
 

 
    @FXML 
 
    void circle1Pressed(ActionEvent event) { 
 
    } 
 

 
    @FXML 
 
    void circle2Pressed(ActionEvent event) { 
 

 
    } 
 

 
    @FXML 
 
    void potPressed(ActionEvent event) { 
 

 
    } 
 

 
    @FXML 
 
    void rSliderChanged(ActionEvent event) 
 
    { 
 
    } 
 

 
    @FXML 
 
    void gSliderChanged(ActionEvent event) { 
 

 
    } 
 

 
    @FXML 
 
    void bSliderChanged(ActionEvent event) { 
 

 
    } 
 

 
    @FXML 
 
    void aSliderChanged(ActionEvent event) { 
 

 
    } 
 

 
    @FXML 
 
    void colorPickerChanged(ActionEvent event) 
 
    { 
 
     Color colorAWT = Utility.javaFXtoAWTColor(colorPicker.getValue()); 
 
     frame.setStyle("-fx-background-color: #" + colorPicker.getValue().toString().substring(2,8) + ";"); 
 
    } 
 

 
    @FXML 
 
    void stroboBarsPressed(ActionEvent event) { 
 

 
    } 
 

 
    @FXML 
 
    void stroboBarsConfigPressed(ActionEvent event) { 
 

 
    } 
 

 
    @FXML 
 
    void stroboCirclesPressed(ActionEvent event) { 
 

 
    } 
 

 
    @FXML 
 
    void stroboCirclesConfigPressed(ActionEvent event) { 
 

 
    } 
 

 
    @FXML 
 
    void fadeColorsPressed(ActionEvent event) { 
 

 
    } 
 

 
    @FXML 
 
    void fadeColorsConfigPressed(ActionEvent event) { 
 

 
    } 
 
}

И расположение FXML

<?xml version="1.0" encoding="UTF-8"?> 
 

 
<?import javafx.scene.paint.*?> 
 
<?import com.jfoenix.controls.*?> 
 
<?import javafx.scene.text.*?> 
 
<?import javafx.geometry.*?> 
 
<?import javafx.scene.control.*?> 
 
<?import java.lang.*?> 
 
<?import javafx.scene.layout.*?> 
 

 

 
<Pane fx:id="frame" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="260.0" prefWidth="620.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.matteoformenti.rgbcontroller.Controller"> 
 
    <children> 
 
     <HBox fx:id="buttonsBox1" layoutY="30.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="40.0" prefWidth="620.0"> 
 
     <children> 
 
      <JFXButton fx:id="bar1" alignment="CENTER" buttonType="RAISED" onAction="#bar1Pressed" ripplerFill="WHITE" style="-fx-background-color: #F44336;" text="Barra 1"> 
 
       <font> 
 
        <Font name="Roboto Light" size="12.0" /> 
 
       </font> 
 
       <HBox.margin> 
 
        <Insets bottom="10.0" left="10.0" right="5.0" top="10.0" /> 
 
       </HBox.margin> 
 
      </JFXButton> 
 
      <JFXButton fx:id="bar2" alignment="CENTER" buttonType="RAISED" layoutX="20.0" layoutY="20.0" onAction="#bar2Pressed" ripplerFill="WHITE" style="-fx-background-color: #F44336;" text="Barra 2"> 
 
       <font> 
 
        <Font name="Roboto Light" size="12.0" /> 
 
       </font> 
 
       <HBox.margin> 
 
        <Insets bottom="10.0" left="5.0" right="5.0" top="10.0" /> 
 
       </HBox.margin> 
 
      </JFXButton> 
 
      <JFXButton fx:id="bar3" alignment="CENTER" buttonType="RAISED" layoutX="80.0" layoutY="10.0" onAction="#bar3Pressed" ripplerFill="WHITE" style="-fx-background-color: #F44336;" text="Barra 3"> 
 
       <font> 
 
        <Font name="Roboto Light" size="12.0" /> 
 
       </font> 
 
       <HBox.margin> 
 
        <Insets bottom="10.0" left="5.0" right="5.0" top="10.0" /> 
 
       </HBox.margin> 
 
      </JFXButton> 
 
      <JFXButton fx:id="bar4" alignment="CENTER" buttonType="RAISED" layoutX="135.0" layoutY="10.0" onAction="#bar4Pressed" ripplerFill="WHITE" style="-fx-background-color: #F44336;" text="Barra 4"> 
 
       <font> 
 
        <Font name="Roboto Light" size="12.0" /> 
 
       </font> 
 
       <HBox.margin> 
 
        <Insets bottom="10.0" left="5.0" right="5.0" top="10.0" /> 
 
       </HBox.margin> 
 
      </JFXButton> 
 
      <JFXButton fx:id="bar5" alignment="CENTER" buttonType="RAISED" layoutX="190.0" layoutY="10.0" onAction="#bar5Pressed" ripplerFill="WHITE" style="-fx-background-color: #F44336;" text="Barra 5"> 
 
       <font> 
 
        <Font name="Roboto Light" size="12.0" /> 
 
       </font> 
 
       <HBox.margin> 
 
        <Insets bottom="10.0" left="5.0" right="5.0" top="10.0" /> 
 
       </HBox.margin> 
 
      </JFXButton> 
 
      <JFXButton fx:id="circle1" alignment="CENTER" buttonType="RAISED" layoutX="280.0" layoutY="20.0" onAction="#circle1Pressed" ripplerFill="WHITE" style="-fx-background-color: #F44336;" text="Cerchio 1"> 
 
       <font> 
 
        <Font name="Roboto Light" size="12.0" /> 
 
       </font> 
 
       <HBox.margin> 
 
        <Insets bottom="10.0" left="20.0" right="5.0" top="10.0" /> 
 
       </HBox.margin> 
 
      </JFXButton> 
 
      <JFXButton fx:id="circle2" alignment="CENTER" buttonType="RAISED" layoutX="340.0" layoutY="10.0" onAction="#circle2Pressed" ripplerFill="WHITE" style="-fx-background-color: #F44336;" text="Cerchio 2"> 
 
       <font> 
 
        <Font name="Roboto Light" size="12.0" /> 
 
       </font> 
 
       <HBox.margin> 
 
        <Insets left="5.0" right="5.0" top="10.0" /> 
 
       </HBox.margin> 
 
      </JFXButton> 
 
      <JFXButton fx:id="pot" alignment="CENTER" buttonType="RAISED" layoutX="395.0" layoutY="10.0" onAction="#potPressed" ripplerFill="WHITE" style="-fx-background-color: #F44336;" text="Potenziometri"> 
 
       <font> 
 
        <Font name="Roboto Light" size="12.0" /> 
 
       </font> 
 
       <HBox.margin> 
 
        <Insets left="20.0" top="10.0" /> 
 
       </HBox.margin> 
 
      </JFXButton> 
 
     </children> 
 
     </HBox> 
 
     <HBox alignment="CENTER" fillHeight="false" layoutY="80.0" prefHeight="40.0" prefWidth="620.0"> 
 
     <children> 
 
      <VBox prefHeight="200.0" prefWidth="100.0" HBox.hgrow="ALWAYS"> 
 
       <children> 
 
        <Label alignment="CENTER" contentDisplay="CENTER" prefHeight="17.0" prefWidth="135.0" text="Rosso" textAlignment="CENTER" /> 
 
        <Slider fx:id="rSlider" max="255.0" onDragDetected="#rSliderChanged" value="128.0" /> 
 
       </children> 
 
       <HBox.margin> 
 
        <Insets left="10.0" right="10.0" /> 
 
       </HBox.margin> 
 
      </VBox> 
 
      <VBox prefHeight="200.0" prefWidth="100.0" HBox.hgrow="ALWAYS"> 
 
       <children> 
 
        <Label alignment="CENTER" contentDisplay="CENTER" prefHeight="17.0" prefWidth="135.0" text="Verde" textAlignment="CENTER" /> 
 
        <Slider fx:id="gSlider" max="255.0" onDragDetected="#gSliderChanged" value="128.0" /> 
 
       </children> 
 
       <HBox.margin> 
 
        <Insets left="10.0" right="10.0" /> 
 
       </HBox.margin> 
 
      </VBox> 
 
      <VBox layoutX="110.0" layoutY="10.0" prefHeight="200.0" prefWidth="100.0" HBox.hgrow="ALWAYS"> 
 
       <children> 
 
        <Label alignment="CENTER" contentDisplay="CENTER" prefHeight="17.0" prefWidth="135.0" text="Blu" textAlignment="CENTER" VBox.vgrow="ALWAYS" /> 
 
        <Slider fx:id="bSlider" max="255.0" onDragDetected="#bSliderChanged" value="128.0" /> 
 
       </children> 
 
       <HBox.margin> 
 
        <Insets left="10.0" right="10.0" /> 
 
       </HBox.margin> 
 
      </VBox> 
 
      <VBox layoutX="210.0" layoutY="10.0" prefHeight="200.0" prefWidth="100.0" HBox.hgrow="ALWAYS"> 
 
       <children> 
 
        <Label alignment="CENTER" contentDisplay="CENTER" prefHeight="17.0" prefWidth="135.0" text="Luminosità" textAlignment="CENTER" /> 
 
        <Slider fx:id="aSlider" max="255.0" onDragDetected="#aSliderChanged" value="128.0" /> 
 
       </children> 
 
       <HBox.margin> 
 
        <Insets left="10.0" right="10.0" /> 
 
       </HBox.margin> 
 
      </VBox> 
 
     </children> 
 
     </HBox> 
 
     <ColorPicker fx:id="colorPicker" layoutX="10.0" layoutY="130.0" onAction="#colorPickerChanged" prefHeight="25.0" prefWidth="600.0" /> 
 
     <HBox alignment="TOP_CENTER" layoutY="175.0" prefHeight="50.0" prefWidth="620.0"> 
 
     <children> 
 
      <HBox prefHeight="50.0" prefWidth="150.0"> 
 
       <children> 
 
        <JFXButton fx:id="stroboBars" alignment="CENTER" buttonType="RAISED" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" onAction="#stroboBarsPressed" ripplerFill="WHITE" style="-fx-background-color: #F44336;" text="Strobo Barre" textAlignment="CENTER" HBox.hgrow="ALWAYS"> 
 
        <HBox.margin> 
 
         <Insets bottom="10.0" left="10.0" right="5.0" top="10.0" /> 
 
        </HBox.margin> 
 
        </JFXButton> 
 
        <Button fx:id="stroboBarsConfig" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#stroboBarsConfigPressed" prefHeight="25.0" prefWidth="25.0" style="-fx-background-color: #33b5e5;" textFill="#33b5e5"> 
 
        <HBox.margin> 
 
         <Insets bottom="10.0" right="10.0" top="10.0" /> 
 
        </HBox.margin> 
 
        </Button> 
 
       </children> 
 
      </HBox> 
 
      <HBox layoutX="150.0" layoutY="10.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="150.0"> 
 
       <children> 
 
        <JFXButton fx:id="stroboCircles" alignment="CENTER" buttonType="RAISED" onAction="#stroboCirclesPressed" ripplerFill="WHITE" style="-fx-background-color: #F44336;" text="Strobo Cerchi" textAlignment="CENTER" HBox.hgrow="ALWAYS"> 
 
        <HBox.margin> 
 
         <Insets bottom="10.0" left="10.0" right="5.0" top="10.0" /> 
 
        </HBox.margin> 
 
        </JFXButton> 
 
        <Button fx:id="stroboCirclesConfig" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#stroboCirclesConfigPressed" prefHeight="25.0" prefWidth="25.0" style="-fx-background-color: #33b5e5;" textFill="#33b5e5"> 
 
        <HBox.margin> 
 
         <Insets bottom="10.0" right="10.0" top="10.0" /> 
 
        </HBox.margin> 
 
        </Button> 
 
       </children> 
 
      </HBox> 
 
      <HBox layoutX="320.0" layoutY="10.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="150.0"> 
 
       <children> 
 
        <JFXButton fx:id="fadeColors" alignment="CENTER" buttonType="RAISED" onAction="#fadeColorsPressed" ripplerFill="WHITE" style="-fx-background-color: #F44336;" text="Strobo Cerchi" textAlignment="CENTER" HBox.hgrow="ALWAYS"> 
 
        <HBox.margin> 
 
         <Insets bottom="10.0" left="10.0" right="5.0" top="10.0" /> 
 
        </HBox.margin> 
 
        </JFXButton> 
 
        <Button fx:id="fadeColorsConfig" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#fadeColorsConfigPressed" prefHeight="25.0" prefWidth="25.0" style="-fx-background-color: #33b5e5;" textFill="#33b5e5"> 
 
        <HBox.margin> 
 
         <Insets bottom="10.0" right="10.0" top="10.0" /> 
 
        </HBox.margin> 
 
        </Button> 
 
       </children> 
 
      </HBox> 
 
     </children> 
 
     </HBox> 
 
    </children> 
 
</Pane>

Спасибо за тонну за вашу помощь, имеют хороший день !! Formenti Маттео

+1

Вам не следует создавать новый экземпляр класса контроллера. Вы должны получить уже загруженный из «FXMLLoader» - см. Здесь http://stackoverflow.com/questions/10751271/accessing-fxml-controller-class Что касается вашего второго вопроса - я не совсем понимаю, что вопрос, или какой метод вы имеете в виду. – Itai

+0

спасибо !! Вот что я искал !!! Это то, что происходит, как только я перетаскиваю любой из слайдеров. Http://pastebin.com/JdDJ0GvR –

+0

Несвязанные, но никогда не импортируйте классы java.awt или javax.swing в приложение JavaFX, если вам действительно не нужно (и вы, вероятно, не нужно). – jewelsea

ответ

1

Исключение вы получаете, потому что вы пытаетесь зацепить MouseEvent обработчик к ActionEvent обработчика - см here. Изменение типа аргумента на MouseEvent должно избавиться от исключения.

Однако! Данное событие имеет дело с drag-and-drop, что, вероятно, не является тем, что вы ищете! См. this tutorial - вы должны либо привязать свойство value слайдера, либо добавить к нему ChangeListener.

Смежные вопросы