解决方案 »

  1.   

    没看太懂你代码,不过你38到42那几行,new ImageIcon()明细引用的是red-ball.gif这种的图片,所以你这个三个图片的路径是不是没写对,所以没有引用到。
      

  2.   

    没有找到不是应该nullPointerException吗?
      

  3.   

    不是的,空指针是你调用没有实例化的对象或对象为空时的方法或属性,如 user.getName();如果user为空,就会报空指针;
    你这个获取不到资源,就不会显示这个图标啊。验证上面猜测很简单,你把red-ball.gif绝对路径写上,如c://images/red-ball.gif 这样试一下,如果可以显示,就说明确实是路径不正确。然后再优化程序,方便程序移植不要使用绝对路径。
      

  4.   

    不是的,空指针是你调用没有实例化的对象或对象为空时的方法或属性,如 user.getName();如果user为空,就会报空指针;
    你这个获取不到资源,就不会显示这个图标啊。验证上面猜测很简单,你把red-ball.gif绝对路径写上,如c://images/red-ball.gif 这样试一下,如果可以显示,就说明确实是路径不正确。然后再优化程序,方便程序移植不要使用绝对路径。package chapter08;import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.ActionMap;
    import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.InputMap;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.KeyStroke;public class ActionFrameAncestor {
    public static void main(String[] args){
    EventQueue.invokeLater(new Runnable(){
    public void run(){
    ActionFrame actionFrame=new ActionFrame();
    actionFrame.setTitle("输入-动作映射");
    actionFrame.setVisible(true);
    actionFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    });
    }
    }
    class ActionFrame extends JFrame{
    private JPanel buttonPanel;
    private static final int DEFAULT_WIDTH=400;
    private static final int DEFAULT_HEIGHT=300;
    public ActionFrame(){
    setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
    buttonPanel=new JPanel();
    Action redAction=new ColorAction("Red",Color.RED);
    Action blueAction=new ColorAction("Blue",Color.BLUE);
    Action yellowAction=new ColorAction("Yellow",Color.YELLOW);
    //将监听器和事件源联系在一起
    buttonPanel.add(new JButton(redAction));
    buttonPanel.add(new JButton(blueAction));
    buttonPanel.add(new JButton(yellowAction));
    add(buttonPanel);
    //下面将通过输入映射和动作映射将图标和键盘联系起来
    InputMap imap=buttonPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    imap.put(KeyStroke.getKeyStroke("ctrl Y"),"panel.yellow");
    imap.put(KeyStroke.getKeyStroke("ctrl B"), "panel.blue");
    imap.put(KeyStroke.getKeyStroke("ctrl R"), "panel.red");

    ActionMap amap=buttonPanel.getActionMap();
    amap.put("panel.yellow", yellowAction);
    amap.put("panel.blue", blueAction);
    amap.put("panel.red", redAction);
    }
    private class ColorAction extends AbstractAction{
    public ColorAction(String name,Color c){
    putValue(Action.NAME,name);
    putValue(Action.SHORT_DESCRIPTION,"set panel color to"+name.toLowerCase());
    putValue("Color",c);
    }
    public void actionPerformed(ActionEvent event){
    buttonPanel.setBackground((Color)getValue("Color"));
    }
    }
    }首先非常感谢你的关注,你的基础很扎实,概念很清晰,其次这是一段corejava中的小程序,非常简单,希望你能看懂,
    我把程序中关于ImageIcon的部分删掉,显示正常,三个点没有了,是正常的Red,Blue,Yellow这种表现,加上以后就是三个点了,说明图片在这里发挥作用了,这应该是java或者eclipse自带的三个图片吧?可以这样理解吗?
      

  5.   

    回楼上,不是图片发挥了作用,是Icon,你看一开始程序,第60行,putValue(Action.SMALL_ICON,icon); 往里放了一个icon,所以你可以看一下这个javax.swing.Icon
      

  6.   

    不懂,这里只是用了Icon引用,在构造方法中putValue(Action.SMALL_ICON,icon)中作形参,是指将动作按钮中小图标设置成icon。在上面的具体构造中我给出了不同的icon,