@lonata

Как упростить написанный код?

Пишу программу, при клике на коричневый прямоугольник слева(назовем его кнопка настроек) из него появляется полоска, а категория, которая связана с с ним уходит вправо(меняет свою ширину,чтобы показать эту полоску)
При клике на кнопку настроек все остальные кнопки деактивируются, и активируются только лишь тогда, когда я снова нажму на текущую кнопку настроек

Программа отлично работает, НО! ооочень много кода) здесь только прописано для 3 категорий, а когда будет все 8 категорий, размер кода увеличится в 10 раз, и даже IDEA подсказывает мне,что код дублируется.
ВОПРОС: Как все оптимизировать и уменьшить размер кода?
я знаю,что например можно деактивацию Toggle Buttons(коричневые прямоугольники , кнопки настроек) можно не прописывать как-то для каждой категории все 8 штук для каждой категориии отдельно,но как это сделать я не знаю=(
Буду признателен за ответ

*Всю разметку делаю через Scene Builder, и там же назначаю экшны для кнопок и методы

Видео

Класс Main:

package card;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.input.*;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import java.awt.*;

public class Main extends Application {

//create variables for dragggable window
private double xOffset = 0;
private double yOffset = 0;

  public static void main(String[] args) {
    launch(args);
  }

  @Override
  public void start(Stage primaryStage) throws Exception {
    try {

      Parent root = FXMLLoader.load(getClass().getResource("/card/card.fxml"));
      Scene scene = new Scene(root, 1200, 600);
      scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
      primaryStage.setMaximized(true);
      primaryStage.setScene(scene);
      primaryStage.initStyle(StageStyle.DECORATED.UNDECORATED);

//make application draggable
      root.setOnMousePressed(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
          xOffset = event.getSceneX();
          yOffset = event.getSceneY();
        }
      });

      root.setOnMouseDragged(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
          primaryStage.setX(event.getScreenX() - xOffset);
          primaryStage.setY(event.getScreenY() - yOffset);
        }
      });

      //assign ALT+ENTER to maximize window
      final KeyCombination kb = new KeyCodeCombination(KeyCode.ENTER, KeyCombination.ALT_DOWN);
      scene.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent event) {
          if (kb.match(event)) {
            primaryStage.setMaximized(!primaryStage.isMaximized());
          }
        }
      });

      //show stage
      primaryStage.show();

    } catch (Exception e) {
      e.printStackTrace();
    }



  }




}


Класс Controller:

package card;

import javafx.animation.*;
import javafx.scene.control.*;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.*;
import javafx.event.ActionEvent;
import javafx.util.Duration;
import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable {

  @FXML  private AnchorPane anchorRow;
  @FXML  private HBox hBoxCat0;
  @FXML  private ToggleButton btnPref1;
  @FXML  private ToggleButton btnPref2;
  @FXML  private ToggleButton btnPref3;
  @FXML  private ToggleButton btnPref4;
  @FXML  private ToggleButton btnPref5;
  @FXML  private ToggleButton btnPref6;
  @FXML  private ToggleButton btnPref7;
  @FXML  private ToggleButton btnPref8;
  @FXML  private Label category1;
  @FXML  private Label category2;
  @FXML  private Label category3;
  private ToggleGroup group;

  @Override
  public void initialize(URL location, ResourceBundle resources) {

    group = new ToggleGroup();
    this.btnPref1.setToggleGroup(group);
    this.btnPref2.setToggleGroup(group);
    this.btnPref3.setToggleGroup(group);

  }


  @FXML
  void openPreference1(ActionEvent event) {
    Timeline tmHbox1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(hBoxCat0.prefWidthProperty(), 250)));
    Timeline tmHboxOne1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(hBoxCat0.prefWidthProperty(), 10)));


    if (btnPref1.isSelected()) {
      GridPane.setRowIndex(anchorRow, 0);
      Timeline timelineHCategory1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(category1.prefWidthProperty(), 1610)));
      tmHbox1.play();
      timelineHCategory1.play();
      btnPref2.setDisable(true);
      btnPref3.setDisable(true);

    }

    else  {
      Timeline timelineHCategoryOne1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(category1.prefWidthProperty(), 1900)));
      timelineHCategoryOne1.play();
      tmHboxOne1.play();
      btnPref2.setDisable(false);
      btnPref3.setDisable(false);

    }
  }
  //Open preference window and make width animation for categories
  @FXML
  void openPreference2(ActionEvent event) {

    Timeline tmHbox1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(hBoxCat0.prefWidthProperty(), 250)));
    Timeline tmHboxOne1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(hBoxCat0.prefWidthProperty(), 10)));


    if (btnPref2.isSelected()) {
      GridPane.setRowIndex(anchorRow, 1);
      Timeline timelineHCategory2 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(category2.prefWidthProperty(), 1610)));
      timelineHCategory2.play();
      tmHbox1.play();
      btnPref1.setDisable(true);
      btnPref3.setDisable(true);
    }

  else  {
     Timeline timelineHCategoryTwo2 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(category2.prefWidthProperty(), 1900)));
      timelineHCategoryTwo2.play();
      tmHboxOne1.play();
      btnPref1.setDisable(false);
      btnPref3.setDisable(false);
  }

  }

  @FXML
  void openPreference3(ActionEvent event) {

    Timeline tmHbox1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(hBoxCat0.prefWidthProperty(), 250)));
    Timeline tmHboxOne1 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(hBoxCat0.prefWidthProperty(), 10)));


    if (btnPref3.isSelected()) {
      GridPane.setRowIndex(anchorRow, 2);
      Timeline timelineHCategory3 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(category3.prefWidthProperty(), 1610)));
      timelineHCategory3.play();
      tmHbox1.play();
      btnPref1.setDisable(true);
      btnPref2.setDisable(true);
    }

    else  {
      Timeline timelineHCategoryThree3 = new Timeline(new KeyFrame(Duration.millis(300), new KeyValue(category3.prefWidthProperty(), 1900)));
      timelineHCategoryThree3.play();
      tmHboxOne1.play();
      btnPref1.setDisable(false);
      btnPref2.setDisable(false);
    }

  }


}


FXML:

  • Вопрос задан
  • 398 просмотров
Решения вопроса 1
jamakasi666
@jamakasi666 Куратор тега Java
Просто IT'шник.
Легко,
во первых как отвечал в прошлом вопросе НЕ ИСПОЛЬЗУЙ Scene Builder, пиши все руками можно даже без fxml.
во вторых оберни весь кошмар с анимацией и кнопочками в отдельный класс компонент, код уже сократится в разы. Деактивацию\активацию других элементов также легко уместить до единого места путем получения у родительского контейнера всех дочерних и выставления в них setDisable
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@lonata Автор вопроса
1.Я использую Scene Builder по нескольким причинам: я могу наглядно посмотреть как будут распологаться все эелементы в приложении, если писать всю разметку дизайна, то это долго очень получается, и если мне нужно переделать местоположение одного компонента нужно кучу всего переделать в XML, в случае с Scene Builder же вся разметка изменяется в эту же секунду.
Почему использование Scene Builder Это плохо? во многих забугорных туториалах его используют
2. Если я к примеру создам класс Animation.java в этом же пакете где все остальные классы, как мне перенести код из Controller? Что нужно сделать чтобы классы Main и Controller видели мой класс Animation и вся анимация работала как и прежде?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы