JWindow失去焦点 自动消失

magic_kid_2010 2013-02-16 08:02:41
用jwindow模仿qq聊天窗口弹出的QQ表情窗口,但是不知道要怎么实现当我点击其他地方,即jwindow失去焦点后,它就自动消失。就和QQ聊天表情窗口一样的效果。求帮忙实现。如果用jwindow不好,求帮忙用其他java组件实现QQ表情窗口。谢谢。
...全文
523 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
oZouBianBian 2013-02-21
  • 打赏
  • 举报
回复
用MouseListener吧,里面有MouseEnter和mouseExit
Java_Super_Man 2013-02-20
  • 打赏
  • 举报
回复
当JWindow失去焦点后会触发失去焦点事件,这时关闭JWindow即可。 需要注册事件监听器。 详情查阅jdk文档。
magic_kid_2010 2013-02-20
  • 打赏
  • 举报
回复
引用 10 楼 changsheng1453052832 的回复:
修改---public ExpressionsWindow (JTextPane jep_input,Window owner){ super(owner); //写上其他的代码 }
public ExpressionsWindow(JTextPane jep_input, JFrame ownerFrame) { super(ownerFrame); // 就多了上面一行...其他代码没变 } 可是还是不行。
Java_Super_Man 2013-02-20
  • 打赏
  • 举报
回复
修改---public ExpressionsWindow (JTextPane jep_input,Window owner){ super(owner); //写上其他的代码 }
magic_kid_2010 2013-02-20
  • 打赏
  • 举报
回复
引用 7 楼 changsheng1453052832 的回复:
多查查jdk文档多试试。
我这里设置了setFocusable(true)和requestFoucs(),可是还是不行。还有您说的设置父窗口,我不知道怎么设置。可以再详细些。或者写一个简单的JWindow失去焦点的Demo吗?谢谢。
magic_kid_2010 2013-02-20
  • 打赏
  • 举报
回复
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吗?谢谢。
Java_Super_Man 2013-02-20
  • 打赏
  • 举报
回复
多查查jdk文档多试试。
Java_Super_Man 2013-02-20
  • 打赏
  • 举报
回复
你看看这个方法setFocusable 还有在new JWindow时指定下父组件
magic_kid_2010 2013-02-20
  • 打赏
  • 举报
回复
引用 4 楼 changsheng1453052832 的回复:
FocusListener
好像不行额。我重写了失去焦点和获得焦点的方法,可是里面的输出语句都不输出的。 我这个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"); } }); 是不是哪里写错了,还是少写了什么?
Java_Super_Man 2013-02-20
  • 打赏
  • 举报
回复
FocusListener
magic_kid_2010 2013-02-19
  • 打赏
  • 举报
回复
引用 1 楼 fangmingshijie 的回复:
怎么弹出来的就怎么关闭不就行了,应该有对应的api吧
您可以试下QQ聊天窗口,点击表情,弹出表情窗口。当我们点击表情窗口的其他地方,表情窗口就会自动关闭。这就好像它失去焦点后,就触发一个事件。但是我试了WindowListener和MouseListener,好像都没效果
  • 打赏
  • 举报
回复
怎么弹出来的就怎么关闭不就行了,应该有对应的api吧

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧