2016-05-21 4 views
0

Так что я в настоящее время создаю этот API. этот класс входа должен просто создать сцену со всеми необходимыми полями для создания графического интерфейса. Проблема, с которой я сталкиваюсь, заключается в том, что мои фигуры ничего не будут делать, когда будут нажаты. У меня есть слушатель событий, но это не сработает.Форма JavaFX на клике

import java.awt.Container; 
    import javafx.application.*; 
    import javafx.event.EventHandler; 
    import javafx.stage.*; 
    import javafx.scene.*; 
    import javafx.scene.layout.*; 
    import javafx.scene.paint.Color; 
    import javafx.scene.shape.Rectangle; 
    import javafx.scene.text.Font; 
    import javafx.scene.text.Text; 
    import javafx.scene.text.TextAlignment; 
    import javafx.scene.control.*; 
    import javafx.scene.image.Image; 
    import javafx.scene.image.ImageView; 
    import javafx.scene.input.MouseEvent; 

public class Login extends MainWindow { 
private Stage primaryStage; 
public static boolean ifContractor=false; 
public static boolean ifClient=false; 
private static Group root; 
private static ImageView iv; 

Login(){ 

} 
public static Scene loginScreen(){ 
    root = new Group(); 
    fillBackround(); 
    createShapes(); 
    System.out.println("I AM ROOT 3 : "+root); 

    Scene loginScene = new Scene(root, 1000,750); 
    return loginScene; 
} 
public static void fillBackround() { 
    Image loginBackround = new Image("loginBackround.jpg",true); 
    iv = new ImageView(); 
    iv.setImage(loginBackround); 
    root.getChildren().add(iv); 

} 
public static void createShapes() { 
    Group shapes = new Group(); 
    Rectangle mainBox = mainBox(); 
    Pane cornerBox = cornerBox(); 
    Pane clientBox = clientBox(); 
    Pane contractorBox = contractorBox(); 

    shapes.getChildren().addAll(mainBox,cornerBox,clientBox,contractorBox); 
    root.getChildren().add(shapes); 
} 
public static Rectangle mainBox() { 
    Rectangle mainBox = new Rectangle(350,100,300,500); 
    mainBox.setStroke(Color.BLUE); 
    mainBox.setFill(Color.DODGERBLUE); 
    mainBox.setStrokeWidth(3); 
    mainBox.setArcWidth(25); 
    mainBox.setArcHeight(25); 
    mainBox.setOpacity(0.5); 
    return mainBox; 

} 
public static Pane cornerBox() { 
    Rectangle cornerBox = new Rectangle(350,100,250,75); 
    cornerBox.setStroke(Color.BLUE); 
    cornerBox.setFill(Color.DODGERBLUE); 
    cornerBox.setStrokeWidth(3); 
    cornerBox.setArcWidth(25); 
    cornerBox.setArcHeight(25); 
    cornerBox.setOpacity(0.5); 
    Text cornerText = new Text(370,150, null); 
    cornerText.setFont(new Font(25)); 
    cornerText.setFill(Color.WHITESMOKE); 
    cornerText.setWrappingWidth(200); 
    cornerText.setTextAlignment(TextAlignment.JUSTIFY); 
    cornerText.setText("Login as: "); 
    Pane cornerStack = new Pane(); 
    cornerStack.getChildren().addAll(cornerBox,cornerText); 
    return cornerStack; 
} 
public static Pane clientBox() { 
    Rectangle clientBox = new Rectangle(400,300,200,75); 
    clientBox.setStroke(Color.BLUE); 
    clientBox.setFill(Color.DODGERBLUE); 
    clientBox.setStrokeWidth(3); 
    clientBox.setArcWidth(25); 
    clientBox.setArcHeight(25); 
    clientBox.setOnMousePressed(new EventHandler<MouseEvent>() 
    { 
     @Override 
     public void handle(MouseEvent t) { 
      ifClient = true; 
      System.out.println("Has been clicked"); 
     } 
    }); 
    Text clientText = new Text(450,350, null); 
    clientText.setFont(new Font(25)); 
    clientText.setFill(Color.WHITESMOKE); 
    clientText.setWrappingWidth(200); 
    clientText.setTextAlignment(TextAlignment.JUSTIFY); 
    clientText.setText("CLIENT"); 
    Pane clientStack = new Pane(); 
    clientStack.getChildren().addAll(clientBox,clientText); 
    return clientStack; 
} 
public static Pane contractorBox() { 
    Rectangle contractorBox = new Rectangle(400,400,200,75); 
    contractorBox.setStroke(Color.BLUE); 
    contractorBox.setFill(Color.DODGERBLUE); 
    contractorBox.setStrokeWidth(3); 
    contractorBox.setArcWidth(25); 
    contractorBox.setArcHeight(25); 
    Text contractorText = new Text(415,450, null); 
    contractorText.setFont(new Font(25)); 
    contractorText.setFill(Color.WHITESMOKE); 
    contractorText.setWrappingWidth(200); 
    contractorText.setTextAlignment(TextAlignment.JUSTIFY); 
    contractorText.setText("CONTRACTOR"); 
    Pane contractorStack = new Pane(); 
    contractorStack.getChildren().addAll(contractorBox,contractorText); 
    return contractorStack; 
} 

} 
+0

Добро пожаловать в StackOverflow. Хотя это хороший старт, чтобы иметь пример в вашем вопросе, он должен быть исполняемым для этих типов вопросов. Пожалуйста, найдите минутку, чтобы посмотреть, как опубликовать [минимальный, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). – hotzst

ответ

1

Проблема ваша Panes накладываются друг на друга. При вызове этого:

shapes.getChildren().addAll(mainBox,cornerBox,clientBox,contractorBox); 

contractorBox (который представляет собой панель) будет находиться на вершине, потребляя все замковое событий.

Вместо этого вы должны использовать ту же самую панель во всех своих методах. Для этого вы можете использовать элемент как:

private static Pane pane = new Pane(); 

затем, например, в cornerBox:

pane.getChildren().addAll(cornerBox,cornerText); 

Это решение для этого случая, НО:

Весь этот класс выглядит странно , Почему вы расширяете MainWindow? Без разницы. Также почему все статично?

Что вам понадобится, класс, расширяющий любые Parent (например, Group), который заполняет родительский элемент всеми необходимыми элементами управления и возвращает родителя. Тогда вы могли бы найти его где угодно:

Scene scene = new Scene(new Login()); 

Я также не понимаю, почему вы рисуете прямоугольники и тексты. В основном вам нужны две кнопки. Вы можете изменить внешний вид кнопок с помощью CSS: Example1, Example2.

+0

Итак, у меня есть класс Drawingpane, который создает все окно. Затем в главном окне загружается сцена в зависимости от условных операторов. Если пользователь нажимает окно клиента в логине, то в главном окне откроется новая сцена. Я не уверен, что это лучший способ сделать это честно. –

+0

Решение для текущей реализации выше: используйте одну и ту же панель в cornerBox, clientBox и contractorBox, а не создавайте новые Panes в каждом методе. Ответ также включает в себя, как он будет реализован вместо этого :) – DVarga

+0

Спасибо, что ты классный! –

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