用jwindow模仿qq聊天窗口弹出的QQ表情窗口,但是不知道要怎么实现当我点击其他地方,即jwindow失去焦点后,它就自动消失。就和QQ聊天表情窗口一样的效果。求帮忙实现。如果用jwindow不好,求帮忙用其他java组件实现QQ表情窗口。谢谢。jwindow 失去焦点 消失

解决方案 »

  1.   

    怎么弹出来的就怎么关闭不就行了,应该有对应的api吧
      

  2.   

    您可以试下QQ聊天窗口,点击表情,弹出表情窗口。当我们点击表情窗口的其他地方,表情窗口就会自动关闭。这就好像它失去焦点后,就触发一个事件。但是我试了WindowListener和MouseListener,好像都没效果
      

  3.   

    当JWindow失去焦点后会触发失去焦点事件,这时关闭JWindow即可。需要注册事件监听器。详情查阅jdk文档。
      

  4.   

    好像不行额。我重写了失去焦点和获得焦点的方法,可是里面的输出语句都不输出的。
    我这个this继承了JWindow
    this.addFocusListener(new FocusAdapter() {

    @Override
    public void focusLost(FocusEvent e) {
    System.out.println("lostfocus");
    } @Override
    public void focusGained(FocusEvent e) {
    System.out.println("getfocus");
    }

    });
    是不是哪里写错了,还是少写了什么?
      

  5.   

    你看看这个方法setFocusable
    还有在new JWindow时指定下父组件
      

  6.   

    public class ExpressionsWindow extends JWindow {
      
    // 表情图片的数量
    private static int expressions_count = 50;
    // 表情大小
    private static int imageIconWidth = 30;

    // 表情窗口的行数和列数
    private static int expressions_rows = 6;
    private static int expressions_columns = 10;
    // 表情窗口的宽度和长度
    public static int expressions_width = imageIconWidth * expressions_columns;
    public static int expressions_height = imageIconWidth * expressions_rows;

    // 表情图片数组
    private ImageIcon[] icon_expressions = new ImageIcon[expressions_count];
    private JButton[] jb_expressions = new JButton[expressions_count];

    // 存放表情容器
    private JPanel jp_expressions = new JPanel();
    private JScrollPane jsp_expressions = new JScrollPane();
    private JList list_expressions;

    // 点击的表情
    private  static String expression_selected;
    // 点击的表情的路径名的长度
    private static int expression_path_length;
    // 表情的名字
    private static String expression_name;

    // 聊天窗口的输入框
    JTextPane jep_input;


    public ExpressionsWindow(JTextPane jep_input) {
    this.jep_input = jep_input;
    initImageIcon();
    initWindow();
    this.setFocusable(true);
    this.requestFocus();
    // 添加窗口事件
    this.addFocusListener(new FocusAdapter() {

    @Override
    public void focusLost(FocusEvent e) {
    System.out.println("lostfocus");
    } @Override
    public void focusGained(FocusEvent e) {
    System.out.println("getfocus");
    }

    });

    }

    // 当前窗口对象
    public JWindow getJWindow() {
    return this;
    } // 加载表情图片
    public void initImageIcon() {
    for(int i = 0; i < expressions_count; i++) {
    ImageIcon imageIcon = new ImageIcon("image/expressions/p" + (i+1) + ".gif");
    jb_expressions[i] = new JButton();
    jb_expressions[i].setBorder(BorderFactory.createLineBorder(new Color(178,223,238)));
    jb_expressions[i].setBackground(Color.WHITE);
    jb_expressions[i].setPreferredSize(new Dimension(imageIconWidth,imageIconWidth));
    jb_expressions[i].setIcon(imageIcon);
    // 添加鼠标事件
    jb_expressions[i].addMouseListener(new MouseAdapter() { @Override
    public void mouseClicked(MouseEvent e) { // 点击事件
    expression_selected = ((JButton)e.getSource()).getIcon().toString();
    expression_path_length = expression_selected.length();
    expression_name = expression_selected.substring(expression_selected.lastIndexOf("/")+1, expression_path_length);
    // 将表情显示到输入框
    insertExpression(expression_selected);
    // 隐藏表情窗口
    getJWindow().setVisible(false);
    getJWindow().dispose();
    }


    });
    }
    }

    // 初始化窗口
    public void initWindow() {
    list_expressions = new JList(jb_expressions);
    list_expressions.setLayoutOrientation(JList.HORIZONTAL_WRAP);
    list_expressions.setVisibleRowCount(6);

    jp_expressions.setLayout(new GridLayout(expressions_rows,expressions_columns));
    for(int i = 0; i < expressions_count; i++) {
    jp_expressions.add(jb_expressions[i]);
    }

    jsp_expressions.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    jsp_expressions.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    jsp_expressions.getViewport().add(jp_expressions);

    this.setLayout(new BorderLayout());
    this.add(jsp_expressions, BorderLayout.CENTER);
    this.setSize(new Dimension(expressions_width,expressions_height));
    this.setVisible(true);
    }

    // 将表情显示到输入框
    public void insertExpression(String expressionUrl) {
    jep_input.insertIcon(new ImageIcon(expressionUrl));
    }

    public static void main(String[] args) {
    new ExpressionsWindow(null);
    }
    }我这里设置了setFocusable(true)和requestFoucs(),可是还是不行。还有您说的设置父窗口,我不知道怎么设置。可以再详细些。或者写一个简单的JWindow失去焦点的Demo吗?谢谢。
      

  7.   

    我这里设置了setFocusable(true)和requestFoucs(),可是还是不行。还有您说的设置父窗口,我不知道怎么设置。可以再详细些。或者写一个简单的JWindow失去焦点的Demo吗?谢谢。 
      

  8.   

    修改---public ExpressionsWindow (JTextPane jep_input,Window owner){
       super(owner);
        //写上其他的代码
    }
      

  9.   

    public ExpressionsWindow(JTextPane jep_input, JFrame ownerFrame) {
    super(ownerFrame);
    // 就多了上面一行...其他代码没变
    }可是还是不行。
      

  10.   

    用MouseListener吧,里面有MouseEnter和mouseExit