2012-12-18 26 views
0

今天我做了一個記事本編輯器爲URDu(阿拉伯語喜歡語言)爲朋友...我想出的代碼很長,我不認爲這是做這件事的正確方法特別是開關在它的情況..有對JFrame-> JTextPaneljava utf-8用法

import java.io.*; 
import javax.swing.*; 
import java.awt.*; 
import java.util.regex.*; 
import java.awt.event.*; 
class MyJFrames extends JFrame implements ActionListener{ 
private JTextArea txt; 
private JMenuBar mb; 
private JMenu file=new JMenu("File"); 
private JMenu edit=new JMenu("Edit"); 
private JMenu format=new JMenu("Format"); 
private JMenuItem open; 
private JMenuItem save; 
private JMenuItem saveAs; 
private JMenuItem exit; 
private JMenuItem find; 
private JMenuItem findAndReplace; 
private JCheckBoxMenuItem wrap; 
private JMenuItem font; 
private JScrollPane pane=null; 
private MyFiling mf=new MyFiling(); 
private static String fileName; 
private static int saveValue=0; 
private JComboBox fontCombo; 
private Font ffont; 
MyJFrames(){ 
    super("Urdu Notepad"); 
     mb=new JMenuBar(); 
    txt = new JTextArea(); 
    txt.setFont(new Font("Arial",1,30)); 
    txt.setWrapStyleWord(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    txt.grabFocus(); 
    txt.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
    open=new JMenuItem("Open"); 
    save=new JMenuItem("Save"); 
    saveAs=new JMenuItem("Save As"); 
    exit=new JMenuItem("Exit"); 
    find=new JMenuItem("Find"); 
    findAndReplace=new JMenuItem("Replace"); 
    wrap=new JCheckBoxMenuItem("Wrap"); 
    font=new JMenuItem("Font"); 
    file.add(open); 
    file.add(save); 
    file.add(saveAs); 
    file.add(exit); 
    edit.add(find); 
    edit.add(findAndReplace); 
    format.add(wrap); 
    format.add(font); 
    mb.add(file); 
    mb.add(edit); 
    mb.add(format); 
    pane=new JScrollPane(txt); 
    setJMenuBar(mb); 
    add(pane); 
    txt.addKeyListener(new keyAdapterOnText()); 
    open.addActionListener(this); 
    save.addActionListener(this); 
    saveAs.addActionListener(this); 
    exit.addActionListener(this); 
    find.addActionListener(this); 
    findAndReplace.addActionListener(this); 
    wrap.addActionListener(this); 
    font.addActionListener(this); 
    setSize(600,600); 
    setVisible(true); 

} 

private class keyAdapterOnText extends KeyAdapter{ 
keyAdapterOnText(){ 
} 
public void keyTyped(KeyEvent key){ 
char enter=key.getKeyChar(); 
key.consume(); 
String st=txt.getText(); 
switch(enter){ 
case 'a': 
    txt.setText(st+"\u0627"); 
    break; 
case 'b': 
txt.setText(st+"\u0628"); 
break; 
case 'c': 
txt.setText(st+"\u0686"); 
break; 
case 'd': 
txt.setText(st+"\u062F"); 
break; 
case 'e': 
txt.setText(st+"\u0639"); 
break; 
case 'f': 
txt.setText(st+"\u0641"); 
break; 
case 'g': 
txt.setText(st+"\u06AF"); 
break; 
case 'h': 
txt.setText(st+"\u06BE"); 
break; 
case 'i': 
txt.setText(st+"\u064A"); 
break; 
case 'j': 
txt.setText(st+"\u062C"); 
break; 
case 'k': 
txt.setText(st+"\u06A9"); 
break; 
case 'l': 
txt.setText(st+"\u0644"); 
break; 
case 'm': 
txt.setText(st+"\u0645"); 
break; 
case 'n': 
txt.setText(st+"\u0646"); 
break; 
case 'o': 
txt.setText(st+"\u0665"); 
break; 
case 'p': 
txt.setText(st+"\u067E"); 
break; 
case 'q': 
txt.setText(st+"\u0642"); 
break; 
case 'r': 
txt.setText(st+"\u0631"); 
break; 
case 's': 
txt.setText(st+"\u0633"); 
break; 
case 't': 
txt.setText(st+"\u062A"); 
break; 
case 'u': 
txt.setText(st+"\u0674"); 
break; 
case 'v': 
txt.setText(st+"\u0637"); 
break; 
case 'w': 
txt.setText(st+"\u0648"); 
break; 
case 'x': 
txt.setText(st+"\u0634"); 
break; 
case 'y': 
txt.setText(st+"\u06D2"); 
break; 
case 'z': 
txt.setText(st+"\u0632"); 
break; 
case 'A': 
txt.setText(st+"\u0622"); 
break; 
case 'B': 
txt.setText(st+"\u0628"); 
break; 
case 'C': 
txt.setText(st+"\u062B"); 
break; 
case 'D': 
txt.setText(st+"\u0688"); 
break; 
case 'E': 
txt.setText(st+"\u0639"); 
break; 
case 'F': 
txt.setText(st+"\u0641"); 
break; 
case 'G': 
txt.setText(st+"\u063A"); 
break; 
case 'H': 
txt.setText(st+"\u062D"); 
break; 
case 'I': 
txt.setText(st+"\u0627"); 
break; 
case 'J': 
txt.setText(st+"\u0636"); 
break; 
case 'K': 
txt.setText(st+"\u062E"); 
break; 
case 'L': 
txt.setText(st+"\u0644"); 
break; 
case 'M': 
txt.setText(st+"\u0627"); 
break; 
case 'N': 
txt.setText(st+"\u06BA"); 
break; 
case 'O': 
txt.setText(st+"\u0629"); 
break; 
case 'P': 
txt.setText(st+"\u0654"); 
break; 
case 'Q': 
txt.setText(st+"\u0642"); 
break; 
case 'R': 
txt.setText(st+"\u0691"); 
break; 
case 'S': 
txt.setText(st+"\u0635"); 
break; 
case 'T': 
txt.setText(st+"\u0679"); 
break; 
case 'U': 
txt.setText(st+"\u0621"); 
break; 
case 'V': 
txt.setText(st+"\u0638"); 
break; 
case 'W': 
txt.setText(st+"\u0648"); 
break; 
case 'Y': 
txt.setText(st+"\u06D2"); 
break; 
case 'Z': 
txt.setText(st+"\u0630"); 
break; 
case ' ': 
txt.setText(st+" "); 
break; 
} 
} 
} 
public void actionPerformed(ActionEvent e){ 
    String title=e.getActionCommand(); 
    if(title.compareTo("Open")==0){ 
     JFileChooser chooser= new JFileChooser(); 
     chooser.showOpenDialog(this); 
     String path= chooser.getSelectedFile().getAbsolutePath(); 
     if(path!=null){ 
      txt.setText("YOU selected file path = "+path); 
      try{ 
       mf.showFile(path); 
      }catch(IOException eX){ 
       System.out.println(" EXCEPTION CAUGHT "+eX); 
      } 
     } 
    } 
    else if(title.compareTo("Save")==0){ 
     if(saveValue==0){ 
      JFileChooser chooser= new JFileChooser(); 
      int option=chooser.showSaveDialog(this); 
      File file=chooser.getSelectedFile(); 
      fileName=file.getName(); 
      System.out.println("saveD and option = "+option+" filename "+fileName); 
      if(option==0){ 
       try{ 
        mf.saveFile(txt.getText(),fileName); 
        saveValue=1; 
       }catch(Exception exe){;} 
      } 
      else{;}    
     } 
     else{ 
      try{ 
       mf.saveFile(txt.getText(),fileName); 
      }catch(Exception exe){ 
       System.out.println(" EXCEPTION CAUGHT "+exe); 
      } 
     } 
    } 
    else if(title.compareTo("Save As")==0){ 
     JFileChooser chooser= new JFileChooser(); 
     int option=chooser.showSaveDialog(this); 
     File file=chooser.getSelectedFile(); 
     fileName=file.getName(); 
     System.out.println("saved and option = "+option+" filename "+fileName); 
     if(option==0){ 
      try{ 
       mf.saveFile(txt.getText(),fileName); 
      }catch(Exception exe){;} 
     } 
    } 
    else if(title.compareTo("Exit")==0){ 
     setVisible(false); 
     System.exit(0); 
    } 
    else if(title.compareTo("Find")==0){ 
     String inputValue = JOptionPane.showInputDialog("Find"); 
     if(inputValue!=null){ 
      String currentText=txt.getText(); 
      if(currentText.toLowerCase().contains(inputValue.toLowerCase())){ 
       JOptionPane.showMessageDialog(this, "String FOUND "); 
      } 
      else 
       JOptionPane.showMessageDialog(this, "String NOT FOUND "); 
     } 
    } 
    else if(title.compareTo("Replace")==0){ 
     String findValue = JOptionPane.showInputDialog("Find"); 
     String currentText; 
     if(findValue!=null){ 
      currentText=txt.getText(); 
      if(currentText.toLowerCase().contains(findValue.toLowerCase())){ 
       String replaceValue = JOptionPane.showInputDialog("Replace"); 
       String replaceText = currentText.replace(findValue,replaceValue); 
       txt.setText(replaceText); 
      } 
      else 
       JOptionPane.showMessageDialog(this, "STRING IS NOT FOUND "); 
     } 
    } 
    else if(title.compareTo("Wrap")==0){ 
     if(wrap.getState()){ 
      txt.setLineWrap(true); 
     } 
     else{ 
      txt.setLineWrap(false); 
     } 
    } 

} 
private class MyFiling{ 
    public void showFile(String path)throws IOException{ 
     File f=new File(path); 
     FileInputStream fst=new FileInputStream(f); 
     int i=0; 
     String text=""; 
     while((i=fst.read())!=-1){ 
      text=text+(char)i; 
     } 
     txt.setText(text); 
     fst.close(); 
    } 
    public void saveFile(String text,String name)throws Exception{ 
     name=name+".txt"; 
     FileOutputStream out=new FileOutputStream(name); 
     out.write(text.getBytes()); 
     out.close(); 
    } 
} 
} 
+1

'case'a': txt.setText(st +「\ u0627」);'背後有什麼想法? –

回答

0

直接寫入UTF-8字符的任何其他方式你有讀/寫文件有問題,不能與JTextArea中。

請使用Reader/Writer來讀取或寫入文本文件。使用正確的編碼,一切都應該沒問題。內部java使用UTF-16,轉換應該由ReaderWriter完成。

當前您正在讀取流中的字節,並嘗試將它們視爲幾乎總是會導致錯誤的字符。