2013-02-21 55 views
6

我附加了javafx的以下示例應用程序,其中有一個用於對話框的對話框類。雖然點擊按鈕存在於對話框上 - 它的內存太高了。簡單地當對話框顯示 - 在taskmanager中支持它需要57kb,然後當我們點擊按鈕和處理對話框 - taskmanager顯示其內存開始增加 - 最後它得到崩潰,獲取轉儲內存異常。在javafx應用程序中單擊對話框按鈕上的內存提高

有樣品 Dialog.java在以下類:它顯示爲OK的對話框 - 取消按鈕 MessageDialog.fxml:此FXML創建對話框 MessageDialogController是關聯文件MessageDialog.fxml JavaFXSample.java是運行此示例的主要類。

Dialog.java

package javafxsample; 

import java.io.IOException; 
import java.io.InputStream; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.fxml.JavaFXBuilderFactory; 
import javafx.scene.Scene; 
import javafx.scene.image.Image; 
import javafx.scene.layout.AnchorPane; 
import javafx.stage.Modality; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

/** 
* 
* @author Admin 
*/ 
public class Dialog { 

    public static void ShowinfoDialog(String title, String Message, Stage parentStage, double w, double h) { 
     if (title == null || title.trim().isEmpty()) { 
      title = "Info"; 
     } 
     showMessageDialog(title, Message, parentStage, "sidetheme.png", w, h); 
    } 

    public static void showMessageDialog(String title, String Message, Stage parentStage, String image, double w, double h) { 
     Stage stage = new Stage(); 
     MessageDialogController messageDialogController = (MessageDialogController) replaceScene("/javafxsample/MessageDialog.fxml", stage); 
     messageDialogController.init(stage, Message, image); 
     if (parentStage != null) { 
      stage.initOwner(parentStage); 
     } 
     stage.initModality(Modality.APPLICATION_MODAL); 
     stage.initStyle(StageStyle.UTILITY); 
     stage.setResizable(false); 
     if (title != null && !title.trim().isEmpty()) { 
      stage.setTitle(title); 
     } 
     stage.setWidth(w); 
     stage.setHeight(h); 
//  Utility.setCentreLocation(stage, parentStage); 
     InputStream inputStream = null; 
     try { 
      inputStream = Dialog.class.getResourceAsStream(image); 
      stage.getIcons().add(new Image(inputStream)); 
     } finally { 
      if (inputStream != null) { 
       try { 
        inputStream.close(); 
       } catch (IOException ex) { 
       } 
      } 
     } 
     stage.showAndWait(); 
    } 

    public static Initializable replaceScene(String fXml, Stage mystage) { 
     InputStream in = null; 
     try { 
      FXMLLoader loader = new FXMLLoader(); 
      in = Dialog.class.getResourceAsStream(fXml); 
      loader.setLocation(Dialog.class.getResource(fXml)); 
      loader.setBuilderFactory(new JavaFXBuilderFactory()); 
      AnchorPane page; 
      try { 
       page = (AnchorPane) loader.load(in); 
      } finally { 
       in.close(); 
      } 
      Scene scene = new Scene(page); 
      mystage.setScene(scene); 
      return loader.getController(); 
     } catch (Exception ex) { 
      System.out.println("Exception in replaceScene. " + fXml + ".Error:" + ex.getMessage()); 
      return null; 
     } 
    } 
} 

JavaFXSample.java

/* 
    * To change this template, choose Tools | Templates 
    * and open the template in the editor. 
    */ 
    package javafxsample; 

    import javafx.application.Application; 
    import javafx.event.ActionEvent; 
    import javafx.event.EventHandler; 
    import javafx.scene.Scene; 
    import javafx.scene.control.Button; 
    import javafx.scene.layout.StackPane; 
    import javafx.stage.Stage; 

    /** 
    * 
    * @author JavaUser1 
    */ 
    public class JavaFXSample extends Application { 

     @Override 
     public void start(final Stage primaryStage) { 
      Button btn = new Button(); 
      btn.setText(" Click on ME "); 
      btn.setOnAction(new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent event) { 
        Dialog.ShowinfoDialog("Sample", "Clicked on button", primaryStage, 400.0, 150.0); 
       } 
      }); 

      StackPane root = new StackPane(); 
      root.getChildren().add(btn); 

      Scene scene = new Scene(root, 300, 250); 

      primaryStage.setTitle("Hello World!"); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } 

     /** 
     * The main() method is ignored in correctly deployed JavaFX application. 
     * main() serves only as fallback in case the application can not be 
     * launched through deployment artifacts, e.g., in IDEs with limited FX 
     * support. NetBeans ignores main(). 
     * 
     * @param args the command line arguments 
     */ 
     public static void main(String[] args) { 
      launch(args); 
     } 
    } 

MessageDialog.fxml

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

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.geometry.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.text.*?> 

<AnchorPane id="AnchorPane" prefHeight="138.0" prefWidth="306.0" xmlns:fx="http://javafx.com/fxml" fx:controller="javafxsample.MessageDialogController"> 
    <children> 
    <TitledPane animated="false" collapsible="false" prefHeight="138.0" prefWidth="347.0" text="" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="-40.0"> 
     <content> 
     <AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0"> 
      <children> 
      <GridPane prefHeight="112.0" prefWidth="282.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
       <children> 
       <Label fx:id="lblicon" text="" GridPane.columnIndex="0" GridPane.halignment="CENTER" GridPane.rowIndex="0"> 
        <GridPane.margin> 
        <Insets top="20.0" fx:id="x1" /> 
        </GridPane.margin> 
       </Label> 
       <Label fx:id="lblMessage" text="" wrapText="true" GridPane.columnIndex="1" GridPane.rowIndex="0"> 
        <font> 
        <Font size="14.0" /> 
        </font> 
        <GridPane.margin> 
        <Insets left="2.0" top="20.0" /> 
        </GridPane.margin> 
       </Label> 
       <Separator prefWidth="200.0" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.rowIndex="1" /> 
       <Separator prefWidth="200.0" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.rowIndex="1"> 
        <GridPane.margin> 
        <Insets top="4.0" /> 
        </GridPane.margin> 
       </Separator> 
       <HBox id="HBox" fx:id="hBox" alignment="CENTER" spacing="5.0" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.halignment="CENTER" GridPane.rowIndex="2" /> 
       </children> 
       <columnConstraints> 
       <ColumnConstraints hgrow="SOMETIMES" maxWidth="82.0" minWidth="82.0" prefWidth="82.0" /> 
       <ColumnConstraints hgrow="SOMETIMES" maxWidth="-1.0" minWidth="10.0" prefWidth="220.0" /> 
       </columnConstraints> 
       <rowConstraints> 
       <RowConstraints maxHeight="-1.0" minHeight="10.0" prefHeight="68.0" vgrow="SOMETIMES" /> 
       <RowConstraints maxHeight="15.0" minHeight="15.0" prefHeight="15.0" vgrow="SOMETIMES" /> 
       <RowConstraints maxHeight="29.0" minHeight="29.0" prefHeight="29.0" vgrow="SOMETIMES" /> 
       </rowConstraints> 
      </GridPane> 
      </children> 
     </AnchorPane> 
     </content> 
    </TitledPane> 
    </children> 
</AnchorPane> 

MessageDialogController.java

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package javafxsample; 

import java.io.InputStream; 
import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.HBox; 
import javafx.stage.Stage; 

/** 
* FXML Controller class 
* 
* @author Admin 
*/ 
public class MessageDialogController implements Initializable { 

    @FXML 
    private Label lblMessage; 
    @FXML 
    private Label lblicon; 
    @FXML 
    private HBox hBox; 
    private Stage myStage; 
    private String clicked = "cancel"; 

    /** 
    * Initializes the controller class. 
    */ 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    } 

    public void btnOkEvent(ActionEvent event) { 
     clicked = "yes"; 
     myStage.close(); 
    } 

    public void btnCancelEvent(ActionEvent event) { 
     clicked = "no"; 
     myStage.close(); 
    } 

    public void init(Stage stage, String Message, String image) { 
     Button btnOk = new Button("OK"); 
     btnOk.setPrefSize(70.0, 23.0); 
     btnOk.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent t) { 
       btnOkEvent(t); 
      } 
     }); 
     hBox.getChildren().add(btnOk); 
     lblMessage.setText(Message); 
     if (image != null && !image.trim().isEmpty()) { 
      Image imageRunBackupPlan = new Image(getClass().getResourceAsStream(image)); 
      lblicon.setGraphic(new ImageView(imageRunBackupPlan)); 
     } 
     this.myStage = stage; 
    } 

    public void init(Stage stage, String Message, String btnOkText, String btnCancelText, String image) { 
     clicked = "cancel"; 
     Button btnOk = new Button(btnOkText); 
     btnOk.setPrefHeight(23); 
     Button btnCancel = new Button(btnCancelText); 
     btnCancel.setPrefHeight(23); 
     hBox.getChildren().addAll(btnOk, btnCancel); 
     btnOk.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent t) { 
       btnOkEvent(t); 
      } 
     }); 
     btnCancel.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent t) { 
       btnCancelEvent(t); 
      } 
     }); 
     lblMessage.setText(Message); 
     if (image != null && !image.trim().isEmpty()) { 
      InputStream inputStream = null; 
      Image imageRunBackupPlan = new Image(getClass().getResourceAsStream(image)); 
      lblicon.setGraphic(new ImageView(imageRunBackupPlan)); 
     } 
     this.myStage = stage; 
    } 

    public String clickedOn() { 
     return clicked; 
    } 
} 
+0

請細說「雖然點擊按鈕對話框存在 - 它的內存引起人們的關注太多了。」 – Puce 2013-02-21 14:08:46

+0

我更新了我的帖子 – 2013-02-21 15:02:59

+0

也許一個分析器可以幫助你找到問題的來源。 – 2013-07-25 11:19:38

回答

相關問題