Kode virker på windows, men ikke unix?

Tags:    java

Hej,

Min javakode skal vente på, at en bruger vælger en fil med filechooser, før den går videre. På windows virker det med følgende while-løkke:

while (fil == null)
{
fil = StartUp.getFile();
}

Men problemet er, at koden ikke virker på mac, linux osv. (unix-styresystemer). Nogen, der ved, hvad problemet kan skyldes og hvordan det kan løses?


På forhånd tak.



Hej,

Hvis du kunne hjælpe os lidt med at fortælle hvad StartUp er for et slags objekt?



Hej,

Hvis du kunne hjælpe os lidt med at fortælle hvad StartUp er for et slags objekt?


Hej, StartUp koden er som følger:


package userinterface;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;


@SuppressWarnings("serial")
public class StartUp extends JFrame {
JFileChooser fc = null;
String file;
static JTextField textDate;
static JTextField textName;
//Container c;
DateFormat dateFormat;
public StartUp () {
super("Kvalitetstjek"); //Giver vinduet et navn.
setSize(350, 200); //Sætter størrelsen på vinduet
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
dateFormat = new SimpleDateFormat("yyyy/MM/dd"); //Finder datoen, skrevet med år/måned/dag
Date date = new Date();
textDate = new JTextField (dateFormat.format(date),(8)); //Skriver datoen i et TextField
JButton buttonFile = new JButton("Åbn fil"); //Laver en knap med teksten åbn fil. Denne knap åbner et nyt vindue.
JLabel labelName = new JLabel("Skriv dit navn:");
textName = new JTextField(20); //Et TextField til at skrive navn i
JLabel labelDate = new JLabel("Angiv dato (År/Måned/Dag):");
fc = new JFileChooser(); //Laver en ny filechooser, det vindue hvor man kan vælge filen.
buttonFile.addActionListener(new ActionListener() { // Giver knappen "Åbn fil" en action som åbner filechooser
public void actionPerformed(ActionEvent ae) {
if (textName.getText().equals("") & textDate.getText().equals("")){ //Dette tjekker, om der er angivet navn og dato
JOptionPane.showMessageDialog(null, "Du skal angive navn og dato!");
} else if (textDate.getText().equals("")) {
JOptionPane.showMessageDialog(null, "Du skal angive en dato!");
} else if (textName.getText().equals("")) {
JOptionPane.showMessageDialog(null, "Du skal skrive dit navn!");
} else {
int option = fc.showOpenDialog(StartUp.this);
if (option == JFileChooser.APPROVE_OPTION) { //Hvis der er valgt en fil og trykket yes/ok g?res f?lgende:
file = fc.getCurrentDirectory().getPath() + System.getProperty("file.separator") + fc.getSelectedFile().getName(); //Filens placering og navn bliver gemt i en variabel a
Object options[] = { "Start", "Annuller" };
int response = JOptionPane.showOptionDialog(null, //Når filen er valgt åbnes der en et nyt vindue, det er i dette vindue at knapperne fra buttonarrayet bliver brugt, i dette vindue opgives:
"Dato: " + textDate.getText() //Den valgte dato
+ "\nNavn: " + textName.getText() //Navnet på personen
+ "\nFil: " + fc.getSelectedFile().getName(), //Navnet på filen
"Skal vi så komme videre?",
JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE,
null,
options,
options[0]);
if (response == JOptionPane.NO_OPTION) { //Tjekker om man trykker "Annuller"
file = ""; //Den valgte fil og navn nulstilles og man begynder forfra
textName.setText("");
} else if (response == JOptionPane.YES_OPTION) { //Tjekker om man trykker "Start"
setVisible(false); //Det hele lukker og databehandlingen kan begynde
} else if (response == JOptionPane.CLOSED_OPTION) { //Tjekker om man trykker "kryds/luk"
file = ""; //Den valgte fil og navn nulstilles og man begynder forfra
textName.setText("");
}
//System.out.println(file);
} else { //Hvis der ikke bliver valgt en fil i filechooser, men derimod trykket annuller, kommer der en tekstboks op.
JOptionPane.showMessageDialog(null, "Du fik aldrig valgt en fil!");
}
}
}
});
//Her bliver de forskellige ting sat ind i startvinduet
add(labelDate);
add(textDate);
//textDate.setBounds(0, 40, 100, 40);
add(labelName);
//labelName.setBounds(0,40,100,40);
add(textName);
add(buttonFile);
//buttonFile.setBounds(0,0,100,40);
}

public static void main(String args[]){
StartUp su = new StartUp();
su.setVisible(true);
System.out.println(su.getFile());
}

public String getFile() {
return file;
}
}




Det vil sige du har:

while (fil == null)
{
fil = StartUp.getFile();
}

sammen med:

public class StartUp ... {
String file;
...
public String getFile() {
return file;
}
}

Det ligner en busy wait, hvilket er ret dumt, specielt hvis man venter på brugeren af en dialogboks.

Desuden er feltet "file" ikke volatile, så du kan ikke være sikker på at når "file" bliver sat af en tråd, at den så også kan ses fra den tråd du læser fra. Men i det hele taget lyder det mystisk at bruge flere tråde.



Kan du ikke sætte din kode ind i code tags og lave indryk, så man kan se hvad der står.

Når du har noget med filer, der virker på windows, men ikke på unix for det mig til at tro, at det kan have noget med path seperatoren at gøre.

På windows ser en path sådan her ud:
Fold kodeboks ind/udKode 

og på unix ser den sådan her ud:
Fold kodeboks ind/udKode 


windows bruger \ og unix bruger /

Desuden er der noget med at \ er escape charator, så derfor skal man skrive \\ i sin kode, for at escape den (ja, folk er utilfredse over at windows folkene valgte \)

Tror java har nogle funktioner et sted, der kan lave platform independant file paths, men jeg kan ikke lige huske hvordan det virker.

Jeg er ikke sikker på det er problemet, og jeg har droppet at kigge den kode igennem, før du sætter den op så man kan læse den :D






t