小弟是JAVA初学者,按着教科书上的例子写了个记事本程序(书上的原文例子),可是运行后功实现不了,那位大侠帮忙改进下,不盛感激。
我的程序是用的监听类分开监听模式。
MouseHandler.javaimport java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;class MouseHandler extends MouseAdapter{
public void mouseReleased(MouseEvent e){
if (e.getButton()==MouseEvent.BUTTON3&&e.getSource()==txtContent){
popupMenu.show(txtContent,e.getX(),e.getY());
}
super.mouseReleased(e);
}
}keyHandler.java
 
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;class keyHandler extends KeyAdapter{
public void keyTyped(KeyEvent e){
if(e.getSource()==txtContent)
lblStatus.setText("已修改");
super.keyTyped(e);
}
}ConfirmHandler.java import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;import javax.swing.JFileChooser;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;class ConfirmHandler implements ActionListener{ @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(!(e.getSource() instanceof JMenuItem))
return;

JMenuItem i = (JMenuItem)e.getSource();

if(i==newItem)
iNew();
else if (i==openItem)
iOpen();
else if (i==saveAsItem)
iSave();
else if (i==cutItem||i==cutPitem)
iCut();
else if (i==copyItem||i==copyPitem)
iCopy();
else if(i==pasteItem||i==pastePitem)
iPaste();
else if (i==aboutItem)
iAbout();

} private void iAbout() {
// TODO Auto-generated method stub
String mes="";
JOptionPane.showMessageDialog(null, mes);
} private void iPaste() {
// TODO Auto-generated method stub
txtContent.paste();
lblStatus.setText("已修改");
} private void iCopy() {
// TODO Auto-generated method stub
txtContent.copy();
pasteItem.setEnabled(true);
pastePitem.setEnabled(true);
} private void iCut() {
// TODO Auto-generated method stub
txtContent.cut();
pasteItem.setEnabled(true);
pastePitem.setEnabled(true);
lblStatus.setText("已修改");
} private void iSave() {
// TODO Auto-generated method stub
JFileChooser chooser = new JFileChooser();
PrintWriter w = null;
File file = null;

if(lblStatus.getText().equals("已修改")){
int s =chooser.showSaveDialog(null);
if(s==JFileChooser.CANCEL_OPTION)
return;
file = chooser.getSelectedFile();
try{
w = new PrintWriter(new BufferedWriter(new FileWriter(file)));

String ss[]=txtContent.getText().split("\n");
for(String st:ss)
w.println(st);

}catch (FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
w.close();
}
}
lblStatus.setText("未修改");
} private void iOpen() {
// TODO Auto-generated method stub
iNew();

JFileChooser chooser = new JFileChooser();
int s = chooser.showOpenDialog(null);
String str = "";

if(s==JFileChooser.APPROVE_OPTION)
{
File file = chooser.getSelectedFile();
BufferedReader r= null;
try{
r = new BufferedReader(new FileReader(file));
while(true){
str = r.readLine();
if(str==null)
break;
txtContent.append(str+"\n");
}
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
try{r.close();}
catch(IOException e){e.printStackTrace();}

}
Notepad.this.setTitle(file.getName());
}
} private void iNew() {
// TODO Auto-generated method stub
if (lblStatus.getText().equals("已修改")){
int confirm = JOptionPane.showConfirmDialog(null, "文件已修改,要另存修改码?");
if (confirm==JOptionPane.OK_OPTION)
iSave();
else if(confirm==JOptionPane.CANCEL_OPTION)
return;
}
txtContent.setText("");
pasteItem.setEnabled(false);
pastePitem.setEnabled(false);
Notepad.this.setTitle("记事本");
lblStatus.setText("未修改");
}

}Notepad.java import java.awt.BorderLayout;
import java.awt.Container;import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;class Notepad extends JFrame{
private JMenuBar mainBar;
private JPopupMenu popupMenu;
private JMenu file,edit,help;
private JMenuItem newItem,openItem,saveAsItem;
private JMenuItem cutItem,copyItem,pasteItem,cutPitem,copyPitem,pastePitem;
private JMenuItem aboutItem;
private JTextArea txtContent;
private JLabel lblStatus;

private ConfirmHandler cHandler = new ConfirmHandler();
private keyHandler kHandler=new keyHandler();
private MouseHandler Mhandler = new MouseHandler();

public Notepad(){
this("记事本");
}

public Notepad(String title){
super(title);
intMenu();
intGUI();

setSize(600,500);
setVisible(true);
setLocation(300,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

} private void intGUI() {
// TODO Auto-generated method stub
Container c = getContentPane();

txtContent = new JTextArea();
txtContent.setLineWrap(true);
txtContent.setWrapStyleWord(true);
txtContent.addKeyListener(kHandler);
txtContent.addMouseListener(Mhandler);

JScrollPane s= new JScrollPane(txtContent);
c.add(s,BorderLayout.CENTER);
lblStatus=new JLabel("未修改");
c.add(lblStatus,BorderLayout.SOUTH);

} private void intMenu() {
// TODO Auto-generated method stub
mainBar = new JMenuBar();
setJMenuBar(mainBar);

file = new JMenu("文件");
newItem = new JMenuItem("新建");
newItem.addActionListener(cHandler);
openItem = new JMenuItem("打开");
openItem.addActionListener(cHandler);
saveAsItem = new JMenuItem("另存为");
saveAsItem.addActionListener(cHandler);
file.add(newItem);
file.add(openItem);
file.add(saveAsItem);

edit=new JMenu("编辑");
cutItem=new JMenuItem("剪切");
cutItem.addActionListener(cHandler);
copyItem = new JMenuItem("复制");
copyItem.addActionListener(cHandler);
pasteItem = new JMenuItem("粘帖");
pasteItem.addActionListener(cHandler);
edit.add(cutItem);
edit.add(copyItem);
edit.add(pasteItem);

popupMenu = new JPopupMenu();
cutPitem = new JMenuItem("剪切");
cutPitem.addActionListener(cHandler);
copyPitem = new JMenuItem("复制");
copyPitem.addActionListener(cHandler);
pastePitem = new JMenuItem("粘帖");
pastePitem.addActionListener(cHandler);
pastePitem.setEnabled(false);
pastePitem.addActionListener(cHandler);
popupMenu.add(cutPitem);
popupMenu.add(copyPitem);
popupMenu.add(pastePitem);

help = new JMenu("帮助");
aboutItem = new JMenuItem("关于 记事本");
aboutItem.addActionListener(cHandler);
help.add(aboutItem);

mainBar.add(file);
mainBar.add(edit);
mainBar.add(help);

}
}MyNotepad.java 
public class MyNotepad { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
new Notepad();
}}

解决方案 »

  1.   

    LZ的代码敲的有问题吧。keyHandler类中lblStatus没看到定义class keyHandler extends KeyAdapter{
    public void keyTyped(KeyEvent e){
    if(e.getSource()==txtContent)
    lblStatus.setText("已修改");
    super.keyTyped(e);
    }
    }
      

  2.   

    我改通过了,能通过的程序如下:
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;import javax.swing.JLabel;
    import javax.swing.JTextArea;class keyHandler extends KeyAdapter{
    protected JTextArea txtContent;
    protected JLabel lblStatus;

    public void settxtContent(JTextArea atxtContent){
    txtContent =atxtContent;
    }
    public void setlblStatus(JLabel alblStatus){
    lblStatus = alblStatus;
    }

    public void keyTyped(KeyEvent e){
    if(e.getSource()==txtContent)
    lblStatus.setText("已修改");
    super.keyTyped(e);
    }
    }
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;import javax.swing.JPopupMenu;
    import javax.swing.JTextArea;class MouseHandler extends MouseAdapter{
    protected JTextArea txtContent;
    protected JPopupMenu popupMenu;

    public void settxtContent(JTextArea atxtContent){
    txtContent =atxtContent;
    }

    public void setpopupMenu(JPopupMenu apopupMenu){
    popupMenu =apopupMenu;
    }

    public void mouseReleased(MouseEvent e){

    if (e.getButton()==MouseEvent.BUTTON3&&e.getSource()==txtContent){
    popupMenu.show(txtContent,e.getX(),e.getY());
    }
    super.mouseReleased(e);
    }
    }import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenuItem;
    import javax.swing.JOptionPane;
    import javax.swing.JTextArea;class ConfirmHandler implements ActionListener{
    JFrame obj;

    protected JMenuItem pasteItem,pastePitem;
    protected JTextArea txtContent;
    protected JLabel lblStatus;

    public ConfirmHandler(Object source)
    {
    obj =(JFrame) source;
    }

    public void settxtContent(JTextArea atxtContent){
    //JOptionPane.showMessageDialog(null,txtContent.hashCode());
    txtContent =atxtContent;
    }
    public void setlblStatus(JLabel alblStatus){
    lblStatus = alblStatus;
    }
    public void setpasteItem(JMenuItem apasteItem){
    pasteItem = apasteItem;
    }
    public void setpastePitem(JMenuItem apastePitem){
    pastePitem = apastePitem;
    }


    @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    if(!(e.getSource() instanceof JMenuItem))
    return;

    JMenuItem i = (JMenuItem)e.getSource();

    switch (i.getLabel()) {
    case "新建":
    iNew();
    break;
    case "打开":
    iOpen();
    break;
    case "另存为":
    iSave();
    break;
    case "剪切":
    iCut();
    break;
    case "复制":
    iCopy();
    break;
    case "粘帖":
    iPaste();
    break;
    case "关于 记事本":
    iAbout();
    break;
    }
    } private void iAbout() {
    // TODO Auto-generated method stub
    String mes="bad";
    JOptionPane.showMessageDialog(null, mes);
    } private void iPaste() {
    // TODO Auto-generated method stub
    txtContent.paste();
    lblStatus.setText("已修改");

    } private void iCopy() {
    // TODO Auto-generated method stub
    txtContent.copy();
    pasteItem.setEnabled(true);
    pastePitem.setEnabled(true);

    } private void iCut() {
    // TODO Auto-generated method stube
    txtContent.cut();
    pasteItem.setEnabled(true);
    pastePitem.setEnabled(true);
    lblStatus.setText("已修改");
    } private void iSave() {
    // TODO Auto-generated method stub
    JFileChooser chooser = new JFileChooser();
    PrintWriter w = null;
    File file = null;

    if(lblStatus.getText().equals("已修改")){
    int s =chooser.showSaveDialog(null);
    if(s==JFileChooser.CANCEL_OPTION)
    return;
    file = chooser.getSelectedFile();
    try{
    w = new PrintWriter(new BufferedWriter(new FileWriter(file)));

    String ss[]=txtContent.getText().split("\n");
    for(String st:ss)
    w.println(st);

    }catch (FileNotFoundException e){
    e.printStackTrace();
    }catch(IOException e){
    e.printStackTrace();
    }finally{
    w.close();
    }
    }
    lblStatus.setText("未修改");
    } private void iOpen() {
    // TODO Auto-generated method stub
    iNew();

    JFileChooser chooser = new JFileChooser();
    int s = chooser.showOpenDialog(null);
    String str = "";

    if(s==JFileChooser.APPROVE_OPTION)
    {
    File file = chooser.getSelectedFile();
    BufferedReader r= null;
    try{
    r = new BufferedReader(new FileReader(file));
    while(true){
    str = r.readLine();
    if(str==null)
    break;
    txtContent.append(str+"\n");
    }
    }catch(FileNotFoundException e){
    e.printStackTrace();
    }catch(IOException e){
    e.printStackTrace();
    }finally{
    try{r.close();}
    catch(IOException e){e.printStackTrace();}

    }
    obj.setTitle(file.getName());
    }
    } private void iNew() {
    // TODO Auto-generated method stub
    if (lblStatus.getText().equals("已修改")){
    int confirm = JOptionPane.showConfirmDialog(null, "文件已修改,要另存修改码?");
    if (confirm==JOptionPane.OK_OPTION)
    iSave();
    else if(confirm==JOptionPane.CANCEL_OPTION)
    return;
    }
    txtContent.setText("");
    pasteItem.setEnabled(false);
    pastePitem.setEnabled(false);
    obj.setTitle("新记事本");
    lblStatus.setText("未修改");
    }

    }import java.awt.BorderLayout;
    import java.awt.Container;import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPopupMenu;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;class Notepad extends JFrame{
    private JMenuBar mainBar;
    private JPopupMenu popupMenu;
    private JMenu file,edit,help;
    private JMenuItem newItem,openItem,saveAsItem;
    private JMenuItem cutItem,copyItem,pasteItem,cutPitem,copyPitem,pastePitem;
    private JMenuItem aboutItem;
    private JTextArea txtContent;
    private JLabel lblStatus;

    private ConfirmHandler cHandler = new ConfirmHandler(this);
    private keyHandler kHandler=new keyHandler();
    private MouseHandler Mhandler = new MouseHandler();

    public Notepad(){
    this("记事本");
    }

    public Notepad(String title){
    super(title);
    intMenu();
    intGUI();

    setSize(600,500);
    setVisible(true);
    setLocation(300,100);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    } private void intGUI() {
    // TODO Auto-generated method stub
    Container c = getContentPane();

    txtContent = new JTextArea();
    //JOptionPane.showMessageDialog(null,txtContent.hashCode())
    cHandler.settxtContent(txtContent);
    kHandler.settxtContent(txtContent);
    Mhandler.settxtContent(txtContent);

    txtContent.setLineWrap(true);
    txtContent.setWrapStyleWord(true);
    txtContent.addKeyListener(kHandler);
    txtContent.addMouseListener(Mhandler);

    JScrollPane s= new JScrollPane(txtContent);
    c.add(s,BorderLayout.CENTER);
    lblStatus=new JLabel("未修改");
    cHandler.setlblStatus(lblStatus);
    kHandler.setlblStatus(lblStatus);

    c.add(lblStatus,BorderLayout.SOUTH);

    } private void intMenu() {
    // TODO Auto-generated method stub
    mainBar = new JMenuBar();
    setJMenuBar(mainBar);

    file = new JMenu("文件");
    newItem = new JMenuItem("新建");
    newItem.addActionListener(cHandler);
    openItem = new JMenuItem("打开");
    openItem.addActionListener(cHandler);
    saveAsItem = new JMenuItem("另存为");
    saveAsItem.addActionListener(cHandler);
    file.add(newItem);
    file.add(openItem);
    file.add(saveAsItem);

    edit=new JMenu("编辑");
    cutItem=new JMenuItem("剪切");
    cutItem.addActionListener(cHandler);
    copyItem = new JMenuItem("复制");
    copyItem.addActionListener(cHandler);
    pasteItem = new JMenuItem("粘帖");
    cHandler.setpasteItem(pasteItem);
    pasteItem.addActionListener(cHandler);
    edit.add(cutItem);
    edit.add(copyItem);
    edit.add(pasteItem);


    popupMenu = new JPopupMenu();
    Mhandler.setpopupMenu(popupMenu);

    cutPitem = new JMenuItem("剪切");
    cutPitem.addActionListener(cHandler);
    copyPitem = new JMenuItem("复制");
    copyPitem.addActionListener(cHandler);
    pastePitem = new JMenuItem("粘帖");
    cHandler.setpastePitem(pastePitem);
    pastePitem.addActionListener(cHandler);
    pastePitem.setEnabled(false);
    pastePitem.addActionListener(cHandler);
    popupMenu.add(cutPitem);
    popupMenu.add(copyPitem);
    popupMenu.add(pastePitem);

    help = new JMenu("帮助");
    aboutItem = new JMenuItem("关于 记事本");
    aboutItem.addActionListener(cHandler);
    help.add(aboutItem);

    mainBar.add(file);
    mainBar.add(edit);
    mainBar.add(help);

    }
    }public class MyNotepad { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    new Notepad();
    }}哎,要是JAVA也有类标号管理特性就好,即在NEW时就给新生成的对象分配一个同名的标签做标识ID,hashCode即不方便也解决不了问题,这样就可以做多语言动态菜单,
      

  3.   

    要是JAVA中有动态地址类数组特性,那么功能就更强大了。
    如:
    1,不用那么多的传址函数
    a,把所有的引用对象放到一个数据组中
    public void setMenuListener(JMenuItem aMenuItem){
    LisMenuItem[LisMenuItem.length +1] = aMenuItem;
    }
    b,根据标点取出各自的引用对象
    public Object getMenuListener(String aID){
     Object rtnMenuItem;
     for(int i =0;i<LisMenuItem.length;i++)
     {
      if (LisMenuItem[i].ID = aID)
      rtnMenuItem = LisMenuItem[i];
     }
     return rtnMenuItem
    }2.实现功能接口可以更简化
    如:
    switch (i.getID()) {
    case "newItem":
    iNew();
    break;
    case "OpenItem":
    iOpen();
    break; 
    case "saveAsItem":
    iSave();
    break;
    case "cutItem":
    iCut();
    break;
    case "copyItem":
    iCopy();
    break;
    case "pasteItem":
    iPaste();
    break;
    case "aboutItem":
    iAbout();
    break; 

    }3,各自实现功能的函数则更简洁
    如:
    private void iCut() {
    // TODO Auto-generated method stube 
    txtContent.cut();
    pasteItem.setEnabled(true);
    pastePitem.setEnabled(true);
    lblStatus.setText("已修改"); 
    }可变为:
    private void iCut() {
    // TODO Auto-generated method stube 
    getMenuListener("txtContent").cut();
    getMenuListener("pasteItem").setEnabled(true);
    getMenuListener("pasteItem").setEnabled(true);
    getMenuListener("lblStatus").setText("已修改"); 
    }哎,一个动态地址数组和每个对象一个标号管理,就可能解决大问题呀!(比如,程序可以更精简且可读性更强,而且可能很方便地实现多语言切换界面,而目前几乎没有几种语言能方便的实现这个功能(多语言界面其实更多的就是一个皮肤更改的问题,如JLabel,只需把Label值改了就行))