2010-09-06 3 views
1

Когда я приношу свое приложение на другой компьютер, две кнопки, которые должны либо открыть браузер файлов, либо взять путь к файлу, чтобы открыть файл, оба не работают. Я не понимаю, почему.Сценарии JavaFX, похоже, не работают на других компьютерах

Он отлично работает, если я скомпилирую его в Netbeans.

package maxsublistsum; 

import javax.swing.JFileChooser; 
import javax.swing.filechooser.FileFilter; 
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.lang.Exception; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.stage.Stage; 
import javafx.scene.control.TextBox; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.scene.control.ListView; 
import javafx.scene.control.ScrollView; 
import javafx.scene.control.Button; 
import javafx.scene.text.Text; 
import javafx.scene.text.Font; 
import javafx.scene.paint.Color; 
import javafx.scene.effect.DropShadow; 
import javafx.scene.Node; 
import javafx.scene.input.MouseEvent; 
import java.io.File; 
import java.io.FileNotFoundException; 
/** 
* @author 
*/ 

public class Main{ 
    var originalList: Integer[]; 
    var maxSublistSum = subListCalculator{}; 


    public-read def Start_Index: Label = Label { 
     width: 27.0 
     height: 27.0 
     text: "Start" 
    } 

    public-read def StartIndexText: TextBox = TextBox { 
     text: bind maxSublistSum.maxStartIndex.toString() 
     editable: false 
    } 

    public-read def StartIndexBox: HBox = HBox { 
     layoutX: 251.0 
     layoutY: 102.0 
     width: 140.0 
     height: 21.0 
     content: [ Start_Index, StartIndexText, ] 
     spacing: 4.0 
    } 

    public-read def End_Index: Label = Label { 
     width: 30.0 
     height: 27.0 
     text: "End" 
    } 

    public-read def EndIndexText: TextBox = TextBox { 
     text: bind maxSublistSum.maxEndIndex.toString() 
     editable: false 
    } 

    public-read def EndIndexBox: HBox = HBox { 
     layoutX: 252.0 
     layoutY: 157.0 
     width: 121.0 
     height: 21.0 
     content: [ End_Index, EndIndexText, ] 
     spacing: 10.0 
    } 

    public-read def Sum: Label = Label { 
     width: 27.0 
     height: 27.0 
     text: "Sum" 
    } 

    public-read def SumText: TextBox = TextBox { 
     text: bind maxSublistSum.maxSum.toString() 
     editable: false 
    } 

    public-read def SumBox: HBox = HBox { 
     layoutX: 258.0 
     layoutY: 45.0 
     width: 172.0 
     height: 21.0 
     content: [ Sum, SumText, ] 
     spacing: 6.0 
    } 

    public-read def results_box: VBox = VBox { 
     layoutX: 185.0 
     layoutY: 140.0 
     width: 120.0 
     height: 80.0 
     content: [ StartIndexBox, EndIndexBox, SumBox, ] 
     spacing: 6.0 
    } 

    public-read def sublist_view: ListView = ListView { 
     width: 150.0 
     height: 170.0 
     items: bind maxSublistSum.maxSubList 
    } 

    public-read def sublist_scroll: ScrollView = ScrollView { 
     layoutX: 320.0 
     layoutY: 140.0 
     width: 150.0 
     height: 170.0 
     node: sublist_view 
     hbarPolicy: javafx.scene.control.ScrollBarPolicy.NEVER 
     vbarPolicy: javafx.scene.control.ScrollBarPolicy.ALWAYS 
    } 

    public-read def file_textBox: TextBox = TextBox{ 
     layoutX: 100.0 
     layoutY: 98.0 
     width: 160.0 
     editable: true 
     text: "Enter path to file here:" 
     onMouseClicked: function(e: MouseEvent): Void { 
      file_textBox.text = ""; 
     } 

    } 

    public-read def calculate_Button: Button = Button { 
     layoutX: 320.0 
     layoutY: 98.0 
     text: "Calculate Max Sub List Sum" 
     onMouseClicked: function(e: MouseEvent): Void{ 
      try {readFile(new File(file_textBox.text))} 
      catch (exception:FileNotFoundException) { 
       Stage{ 
       title: "File Error!" 
       scene: Scene { 
        width: 175.0 
        height: 40.0 
        content: Label { 
         text:"File Not Found Error!" 
         font: TitleFont 
         } 
        } 
       } 
      } 
     } 


    } 

    public-read def select_file: Button = Button { 
     layoutX: 10.0 
     layoutY: 98.0 
     text: "File Browser" 
     onMouseClicked: function(e: MouseEvent): Void { 
      select_fileAction(); 
    } 

    } 

    public-read def original_listView: ListView = ListView { 
     width: 150.0 
     height: 170.0 
     items: bind listView2Items 
    } 

    public-read def original_scroll: ScrollView = ScrollView { 
     layoutX: 10.0 
     layoutY: 140.0 
     width: 150.0 
     height: 170.0 
     node: original_listView 
     hbarPolicy: javafx.scene.control.ScrollBarPolicy.NEVER 
    } 

    public-read def Original_List: Label = Label { 
     layoutX: 50.0 
     layoutY: 118.0 
     width: 60.0 
     text: "Original List" 
    } 

    public-read def Sub_List: Label = Label { 
     layoutX: 370.0 
     layoutY: 118.0 
     width: 40.0 
     text: "Sub-List" 
    } 

    public-read def Help_Text: Text = Text { 
     layoutX: 90.0 
     layoutY: 75.0 
     wrappingWidth: 300.0 
     x: 0.0 
     content: "This program accepts files with .txt and .dat file extensions " 
     "where the intergers of a list are provided on seperate lines." 
    } 

    public-read def TitleFont: Font = Font { 
     size: 22.0 
     embolden: true 
    } 

    public-read def blue: Color = Color { 
     red: 0.4 
     green: 0.6 
     blue: 1.0 
    } 

    public-read def dropShadow: DropShadow = DropShadow { 
     color: blue 
     width: 10.0 
     height: 10.0 
    } 

    public-read def Title: Label = Label { 
     layoutX: 20.0 
     layoutY: 20.0 
     width: 440.0 
     effect: dropShadow 
     text: "Determine the Sub-List with the Maximum Sum!" 
     font: TitleFont 
    } 

    public-read def My_Name: Label = Label { 
     layoutX: 165.0 
     layoutY: 261.0 
     effect: dropShadow 
     text: "Author" 
     font: TitleFont 
    } 

    public-read def scene: Scene = Scene { 
     width: 480.0 
     height: 320.0 
     content: getDesignRootNodes() 
    } 

    public-read def currentState: org.netbeans.javafx.design.DesignState = 
     org.netbeans.javafx.design.DesignState { 
    } 

    public function getDesignRootNodes(): Node[] { 
     [ calculate_Button, file_textBox, results_box, sublist_scroll, select_file, 
     original_scroll, Original_List, Sub_List, Help_Text, My_Name, Title, ] 
    } 

    public function getDesignScene(): Scene { 
     scene 
    } 

    var listView2Items: Object[] = bind originalList; 

    function select_fileAction(): Void { 
     var extensions = [".txt", ".dat"]; 
     var fileChooser = new JFileChooser(); 
     fileChooser.addChoosableFileFilter(
      FileFilter{ 
       override function getDescription(){"Data {extensions.toString()}"} 
       override function accept(file:File){ 
        if (file.isDirectory()){return true} 
        var name = file.getName().toLowerCase(); 
        for (extension in extensions){ 
         if (name.endsWith(extension)){ 
          return true; 
         } 
        } 

        return false 
       } 

      }); 
     originalList = []; 
     var returnVal = fileChooser.showOpenDialog(null); 
     if (returnVal == JFileChooser.APPROVE_OPTION){}; 
     readFile(fileChooser.getSelectedFile()); 
    } 
    function readFile(file:File): Void { 

     var reader = new BufferedReader(
          new FileReader (
            file)); 
     while (true){ 
      var line = reader.readLine(); 
      if (line == null){break} 
      try { 
       var currentInteger: Integer = java.lang.Integer.parseInt(line); 
       insert currentInteger into originalList; 
      } 
      catch (e:Exception){ 
       Stage{ 
       title: "File Error!" 
       scene: Scene { 
        width: 150.0 
        height: 40.0 
        content: Label { 
         text:"File Input Error!" 
         font: TitleFont 
         } 
        } 
       } 
       originalList = []; 
       break; 
      } 
     } 
     maxSublistSum.updateList(originalList); 
    } 
} 

function run(): Void { 
    var design = Main {}; 

    javafx.stage.Stage { 

     title: "Main" 
     scene: design.getDesignScene() 
    } 
} 

И алгоритм:

public class subListCalculator { 

public-read var maxStartIndex: Integer = -1; 
public-read var maxEndIndex: Integer = -1; 
public-read var maxSum: Integer = 0; 
public-read var maxSubList: Integer[]; 
var currentSubList: Integer[]; 
var currentSum: Integer = 0; 
var currentStartIndex: Integer = -1; 
public var list: Integer[]; 


function resetValues(): Void{ 
    maxStartIndex = -1; 
    maxEndIndex = -1; 
    maxSum = 0; 
    currentSubList = []; 
    maxSubList = []; 
    currentSum = 0; 
    currentStartIndex = -1; 
} 

public function updateList (newList:Integer[]): Void{ 
    resetValues(); 
    list = newList; 
    var lastIndex = list.size() - 1; 

    for (i in [0..lastIndex]) { 
     var currentValue = list[i]; 

     if (currentSum > 0) { 
      currentSum = currentSum + currentValue; 
      if (currentStartIndex == -1) { currentStartIndex = i } 
      insert currentValue into currentSubList; 
     }else { 
      currentSum = currentValue; 
      currentStartIndex = i; 
      currentSubList = [currentValue]; 
     } 
     if (currentSum > maxSum){ 
      maxSum = currentSum; 
      maxEndIndex = i; 
      maxStartIndex = currentStartIndex; 
      maxSubList = currentSubList 
     } 
    } 
} 

}//End of class 
+0

Переформатированный код; пожалуйста, верните, если это неверно. – trashgod

ответ

3

Он отлично работает, если я скомпилировать его в Netbeans.

Как правило, NetBeans помещает копии требуемых библиотек вместе с JAR в папку с именем dist. Вы можете проверить, что вы включаете любые другие требуемые JAR, когда вы копируете вещи в другом месте.

Приложение: В статье Deploying JavaFX Applications может быть что-то полезное. Кроме того, некоторые старшие пусковые установки JWS могут не правильно support class-path wildcards.

+0

Прежде всего, спасибо за исправление форматирования! В папке dist находятся файлы .jar и .jnlp. Я попытался включить в библиотеку больше библиотек (я попытался включить javaee-api-6.0.jar, где я понял javax.swing и java.awt). Он все еще работает неправильно. –

+0

Мне нужно изменить кодовую базу в jnlp на любой файл :.или точный путь к файлу на новом ПК (он работает в обоих направлениях, но не в файле «file :.» все время ... Я выбрал это из какого-то форума Sun). Когда он открывается, у меня есть две кнопки, которые используют вызовы Java API, один для JFileChooser (наряду с BufferedReader/FileReader), а другой - только путь к файлу и использует BufferedReader/FileReader. Ни одна из этих кнопок не работает на другом компьютере. –

+0

Пакеты 'javax.swing' и' java.awt' являются частью JRE. У другой машины установлена ​​последняя JRE? – trashgod

0

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

У меня было только 5 библиотек, чтобы начать с:

MySQL-разъем-java.5.1.34-bin.jar EclipseLink (stuff- 3 библиотеки) JDK 1.8 (по умолчанию)

Я пошел в Java 1.8, и увидел, что javafx включен в библиотеку, но я решил добавить javaFX, чтобы узнать, что произойдет в любом случае.

  1. Щелкните правой кнопкой мыши проект и выберите свойства.
  2. Щелкните элемент меню «Библиотеки» слева.
  3. Нажмите Добавить Jar/Folder
  4. Внутри выбора файла я вошел в мое текущее место JDK Java. Для меня это было, C: \ Program Files \ Java \ jdk1.8.0_40. Затем щелкните javafx-src.zip в качестве библиотеки для добавления. CLick open, затем нажмите ok в меню свойств.
  5. После этого запустите проект «Очистить и построить».
  6. Затем упаковали программу только как изображение. Если вам нужно скопировать весь каталог приложений или вам нужно сделать свой собственный установщик для перемещения папки, а затем поместить ярлык в приложение.

После того, как упакован перешел на другой компьютер и попробовал его, работал как шарм !!!

Надеюсь, это поможет кому-то.

Счастливое программирование!