Gå til innhold

[Løst] Importere docs inn i JTextField?


Anbefalte innlegg

Hei, jeg driver å lager et quiz program ift et prosjekt. (docs eller txt's er vel egentlige spørsmålet)

Tenkte i den duren å mekke en class for å danne spørsmålene, for så at spillet importerte disse (dette skulle kunne skje i 2 isolerte events.)

I den duren tenkte jeg å lage mange tomme docs opp til kanskje 20, (40 siden spm og svar)+1 for ant spm

Kan nevne at jeg tenkte å bruke JTextComponent :)

Men det jeg da lurte på var hva jeg bruker til doc editen og importen, i den duren fant jeg funksjonene Public document getdocument()

og public void document setdocument()

Kan jeg bruke setdocument til å edite og getdocument når jeg skal hente? stod veldig lite om nøyaktige funksjonaliteten til disse!

på forhånd takk! :)

(ps klarte å poste feil først derfor dobbelpost :( )

bruker foresten JTextField tenkte jeg.,

Endret av Gnurk(homesmasher)
Lenke til kommentar
Videoannonse
Annonse

Det gjelder forsåvidt .txt's og jeg tror jeg har funnet ut av litt mer, jeg tror jeg må først importere filen på en nokså tungvinn måte

Med metoden File først, for så å hente ut lines fra denne. det er forsåvidt greit, jeg tok en titt her:

http://docs.oracle.com/javase/6/docs/api/java/io/File.html

Jeg sliter litt med å forstå hva parent og child pathways etc er.

 

Ta denne f.eks

File(File parent, String child)

Creates a new File instance from a parent abstract pathname and a child pathname string.

hva ville jeg skrevet inn for å få tak i filen som ligger i samme mappe som .java fila jeg programmerer i?

eller er dette feil metode å bruke?

 

prøvde med:

File(String pathname)

Creates a new File instance by converting the given pathname string into an abstract pathname.

 

Men jeg får d ikke til med den heller, pathname ville jeg tro var bare copy paste av det vi generelt sett kaller pathwayen?

Lenke til kommentar

hva ville jeg skrevet inn for å få tak i filen som ligger i samme mappe som .java fila jeg programmerer i?

 

Du er bedre tjent med å tenke på hvor txt filen ligger uavhengig av hvor .java filen ligger. Lag f.eks en variabel fileStorage som holder rede på et område du leser/lagrer dokumenter på.

 

 String fileStorage = System.getProperty("user.home"); //Evt les inn fra args til main, spør brukeren, etc
 File f = new File(fileStorage + "/minfil.txt");
 if(f.exists()){
  //...
 }

 

Edit - Litt mer omfattende forklaring:

java filen blir kompilert til en .class fil som inngår i classpathen når du kjører programmet. Hvis du virkelig vil lagre en txt fil og tar den med i classpathen til programmet kan du hente den med Thread.currentThread().getContextClassLoader().getResourceAsStream("minfil.txt")

Jeg vil ikke anbefale denne løsningen i ditt tilfelle.

Endret av Kiff
Lenke til kommentar

Det skal stå slik, det er ikke meningen du skal sette inn brukerens navn istedetfor user. Poenget er å hente ut brukerens hjemmeområde uten å vite hvilken bruker det er. Som oftest er den /home/[brukernavn] på linux++ og c:/users/[brukernavn] på windows (tilsvarer hhv $HOME og %UserProfile% systemvariablene)

 

Det var bare et eksempel, men "user.home" er ofte et greit utgangspunkt :)

Lenke til kommentar

Jeg beklager å mase så mye, men jeg må nok en gang spør, jeg ser på metoden her: http://commons.apach...java.io.File%29

 

spesifikt på readLines

public static List&--#60;String&--#62; readLines(File file)

throws IOException

Reads the contents of a file line by line to a List of Strings using the default encoding for the VM. The file is always closed.

Parameters:

file - the file to read, must not be null

Returns:

the list of Strings representing each line in the file, never null

 

Jeg får ikke til å forstå hvordan man kaster metoden...

 

utifra return etc så gikk jeg utifra at det ville blitt:

listen=readLines(filen);

men dette fungerer absolutt ikke.

 

 

tror jeg har funnet problemet

http://commons.apache.org/io/api-2.0/org/apache/commons/io/FileUtils.html#readLines%28java.io.File%29

metodene her eksisterer ikke for meg, men hvorfor?

Endret av Gnurk(homesmasher)
Lenke til kommentar

Apache commons er en samling med verktøy som er "kjekt å ha", de er metoder som gjør mange vanlige ting slik at du slipper å gjøre dette selv. Hvis du vil benytte dem må du laste ned jar filen og legge den på claspathen til programmet ditt.

 

Du kan laste ned commons-io her http://archive.apache.org/dist/commons/io/ (filen du trenger er commons-io-current-bin, zip eller tar.gz avhengig av hva du foretrekker)

Lenke til kommentar

Det skal ikke være nødvendig å laste ned apache. Slik filbehandling går fint uten.

 

Jeg er ikke helt sikker på om jeg forstår 100% hva du har tenkt å få til, men hadde jeg vært deg, så ville jeg heller ha lagt alle spørsmål i ei .txt-fil i stedet for 20(40) separate filer.

Hvis du legger hvert spørsmål på hver sin linje i .txt-fila, så kan du importere hvert spørsmål inn i f. eks. et array eller Arraylist. (hvis du vil samle spørsmål med tilhørende svar, så kan du bruke en to-dimensjonal array.)

Bruk Scanner el. FileReader/BufferedReader med tilhørende metoder for å lese hver linje.

Endret av Keiser'n
Lenke til kommentar

(Har det skjedd noe med editoren etter forum oppgraderingen? Den tar bl.a bort alle newline når jeg limer inn kode.)

 

FileTextReader.readFromFile(file) leser innholder i en tekstfil og returnerer en array (med hver linje).

 

import java.io.BufferedReader;
import java.io.Closeable;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


public class FileTextReader {

public static String[] readFromFile(File file) throws IOException {
 List<String> result = new ArrayList<String>();
 if (!file.exists()) {
  throw new IOException("File " + file.getAbsolutePath()
 + " does not exist.");
 }
 FileReader fr = null;
 BufferedReader br = null;
 try {
  fr = new FileReader(file);
  br = new BufferedReader(fr);
  String currentline = null;
  while ((currentline = br.readLine()) != null) {
   result.add(currentline);
  }
 } finally {
  safeClose(fr, br);// In java 7 use try-with-close instead
 }
 return result.toArray(new String[0]);
}

private static void safeClose(Closeable... c) {
 for (Closeable c2 : c) {
  safeClose(c2);
 }
}


private static void safeClose(Closeable c) {
 if (c != null) {
  try {
   c.close();
  } catch (IOException e) {
  }
 }
}

}

  • Liker 1
Lenke til kommentar

 

package aaretssiste;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

//prover aa importere jave commons
import aaretssiste.docs.org.apache.commons.io.*;
import aaretssiste.docs.org.*;
public class Mekkspm extends JPanel implements ActionListener{
private JButton leggtilKnapp, nesteSpmKnapp, leggtilKnapp2, avsluttKnapp, resetKnapp;
// innskriv er tekst sotte opp, skriving er der brukeren skriver inn
public JTextField innSkriv, skriving;
private String[] spmTabell;
private String str;
private int ant;
public Qnnskap vindu;
public Mekkspm(Qnnskap vindu){

JFrame frame = new JFrame("Lagsporsmaltilquiz");

innSkriv=new JTextField();
skriving=new JTextField();
innSkriv.setPreferredSize(new Dimension(360,60));
skriving.setPreferredSize(new Dimension(400,60));
innSkriv.setEditable(false);
this.vindu=vindu;
setPreferredSize(new Dimension(800,600));
avsluttKnapp=new JButton("Avslutt");
avsluttKnapp.addActionListener((ActionListener) this);
avsluttKnapp.setLocation(300,300);
add(avsluttKnapp);
nesteSpmKnapp=new JButton("Legg til neste SPM");
nesteSpmKnapp.addActionListener((ActionListener) this);
add(nesteSpmKnapp);
leggtilKnapp=new JButton("Legg til spm");
leggtilKnapp.addActionListener((ActionListener) this);

leggtilKnapp2=new JButton("Legg til svar");
leggtilKnapp2.addActionListener((ActionListener) this);

add(skriving);
add(innSkriv);
add(leggtilKnapp);
add(leggtilKnapp2);
resetKnapp=new JButton("Fjern alle sporsmaal og svar");
resetKnapp.addActionListener((ActionListener) this);
add(resetKnapp);
avsluttKnapp.setEnabled(true);
leggtilKnapp2.setEnabled(false);
nesteSpmKnapp.setEnabled(true);
leggtilKnapp.setEnabled(false);

//finn ut antall eksisterende sporsmaal
 String fileStorage = System.getProperty("user.home");
 File f = new File(fileStorage + "/AntSpm.txt");
 if(f.exists()){
 // readFileToString(f,str);
  ant = Integer.parseInt(str);


 }


}
//lager sporsmaal og "saver det"
public void leggTilSpm(){
str=skriving.getText();
skriving.setText("");
 ant++;
 String fileStorage = System.getProperty("user.home");
 String filString="/Spm"+ant+".txt";
  File f = new File(fileStorage + filString);
 //writeStringToFile(f,str);
}


//lager svar ("saver det")
public void leggTilSvar(){
str=skriving.getText();
skriving.setText("");

String fileStorage = System.getProperty("user.home");
String filString = "/Svar"+ant+".txt";
File f=new File(fileStorage + filString);
//writeStringToFile(f, str);
}
//actionlistener til knappene, her legger jeg inn ALT som skal være knyttet til å skje ved knapptrykk/etterpå (inkludert kjør andre metoder)
public void actionPerformed(ActionEvent e){

if(e.getSource()==nesteSpmKnapp){
innSkriv.setText("Skriv inn sporsmaalet");
skriving.setText("");
repaint();
avsluttKnapp.setEnabled(false);
leggtilKnapp2.setEnabled(false);
nesteSpmKnapp.setEnabled(false);
leggtilKnapp.setEnabled(true);
}
else if(e.getSource()==leggtilKnapp){
//leggTilSpm();
avsluttKnapp.setEnabled(false);
leggtilKnapp2.setEnabled(true);
nesteSpmKnapp.setEnabled(false);
leggtilKnapp.setEnabled(false);
repaint();
innSkriv.setText("Sporsmaal lagret, skriv inn svar");
}
else if(e.getSource()==leggtilKnapp2){
 leggTilSvar();
 avsluttKnapp.setEnabled(true);
 leggtilKnapp2.setEnabled(false);
 nesteSpmKnapp.setEnabled(true);
 leggtilKnapp.setEnabled(false);
 innSkriv.setText("Sporsmaal og svar lagret,"+"\n"+"avslutt eller lag nytt spm");
}
else if(e.getSource()==avsluttKnapp){
 //Sletter først AntSpm.txt for så å erstatte med korrekt antall spm så avslutter det programmet
  String fileStorage = System.getProperty("user.home");
  File f = new File(fileStorage + "/AntSpm.txt");
  if(f.exists()){
str=""+ant;
 //  forceDelete(f);
 //  writeStringToFile(f,str);
  }
 System.exit(0);
}
else if(e.getSource()==resetKnapp){
  String fileStorage = System.getProperty("user.home");
  File f = new File(fileStorage + "/AntSpm.txt");
  ant=0;
  str=""+ant;
  // readStringToFile(f,str);
}
//lag en reset funksjon, alt som trengs er at jeg forandrer antSpm=0 (filen).
}
}

 

Dette er koden min, kan være små feil, men det er irrellevant, mine writeStringtoFile(file, string) fungerer ikke, jeg får rett og slett ikke importert.

 

Jeg ekstrakta til C:\Users\christer\workspace\src\bin\aaretssiste (aaretssiste er pakkenavnet, der filen ligger)

Er dette feil? hva er det som må forandres får å få disse metodene til å fungere?

edit: ser at jeg glemte å ta dem tilbake fra // men de fungerer fortsatt ikke, trust me!

Endret av Gnurk(homesmasher)
Lenke til kommentar

Du trenger strengt tatt ikke apache pakken, men hvis du vil bruke den så må du legge den til classpathen til programmet ditt (på kommandolinjen er dette "-cp dir-med-jars", i de fleste IDEs gjøres det som en del av prosjektoppsettet)

 

Uantsett, du kan bruke denne for å skrive til fil:

 

public void writeStringToFile(File f, String str) throws IOException {
 FileWriter fw = null;
 BufferedWriter bw = null;
 try {
  fw = new FileWriter(f, true);//Append
  bw = new BufferedWriter(fw);
  bw.write(str);
  bw.flush();
 } finally {
  safeClose(bw);
  safeClose(fw);
 }
}
private static void safeClose(Closeable c) {
 if (c != null) {
  try {
c.close();
  } catch (IOException e) {
  }
 }
}

 

edit: sleng inn denne for å være sikker på at hver linje avsluttes med newline.

 if(!str.endsWith("\n")){
  str += "\n";
 }

Endret av Kiff
Lenke til kommentar

Jeg MÅ egentlig få funksjonene til å fungere (skal helst "stjele" så lite kode som mulig fra nettet, men det er egentlig ikke hovedgrunnen jeg bruker flere enn bare disse 2 funksjonene av fileUtils i tillegg så danner writetofile ny fil om den ikke eksisterer(som er meget viktig her)

 

Jeg er kanskje ekstremt dum, men jeg vet ikke helt dette med "classpath"

jeg har denne mappen med "java" men mistenker det er ift kjøring i mozilla etc

C:\Program Files\Java\jre6 jre directoriet inneholder de 2 mappene: bin og lib.

 

Jeg jobber utifra: C:\Users\christer\workspace

workspace har de 2 mappene: .metadata og src

 

i src ligger 3 mappet .settings, src og bin

i bin og src ligger prosjektet som jeg jobber utifra (aaretssiste)

i src ligger de som lesbare dokumenter mens i bin ligger de som .class

jeg ville TRODD jeg skulle legge filen inni src men det fungerte absolutt ikke for meg.

 

Om du skulle vært villig så må du gjerne adde meg på skype eller noe (huleboeren 16) mitt navn er Christer Berg om det kommer frem mer.

 

kanskje du kunne brukt et av disse "styr noens pc" programmene, dette er helt håpløst og jeg må teste at det fungerer etc innen mandag :\

Lenke til kommentar

Høyreklikk på prosjektet, velg properties. Velg "Java Build Path" i venstre sidemeny og så fliken "Libraries". Trykk på knappen "Add External JARs..." og velg jar filen du lastet ned. (den heter sikkert noe sånt som commons-io-XYZ.jar)

 

Endre slik at du kaller metodene med FileUtils.writeToFile(...);

 

legg til "import org.apache.commons.io.FileUtils;"

(eclipse ordner imports hvis du trykker ctrl+shift+o)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...