JavaFX Scripts do not seem to work on other computers
When I bring my app to another computer the two buttons that should either open a file browser, or take in a file path to open a file both don't work. I don't understand why.
It works perfectly fine if I compile it within 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 ()
}
}
And the Algorithm:
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 = [];
curr开发者_StackOverflow中文版entSum = 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
It works perfectly fine if I compile it within Netbeans.
Typically, NetBeans puts copies of required libraries alongside your JAR in a folder named dist
. You might check that you're including any other required JARs when you copy things elsewhere.
Addendum: There may be something helpful in the article Deploying JavaFX Applications. Also, some older JWS launchers may not correctly support class-path wildcards.
I was having the same issue and could not find a way to fix this, until I thought about what was said in the previous answer about Libraries not being included.
I had only 5 libraries to begin with:
mysql-connector-java.5.1.34-bin.jar EclipseLink (stuff- 3 Libraries) JDK 1.8(Default)
I went into the Java 1.8 one and saw that javafx is including in the library, but I decided add javaFX to see what would happen anyways.
- Right-click the project and click properties.
- Click the Libraries menu item, on the left hand side.
- Click Add Jar/Folder
- Inside the file chooser, I went into my current java JDK place. For mine it was, C:\Program Files\Java\jdk1.8.0_40. Then Click the javafx-src.zip as the Library to add. CLick open, then click ok on the properties menu.
- After this, Run 'Clean and Build' Project.
- Then packaged the program as Image Only. Where you have to copy the entire app directory or you have to make your own installer to move the folder, and then place a shortcut to the application.
After being packaged went to the other computer and tried it, Worked like a charm!!!
I hope this helps someone.
Happy Programming!
精彩评论