setUndecorated(true)搞乱toFront()

时间:2014-12-23 08:09:33

标签: java swing jframe

我将这两个JFrame在setUndecorated设置为false时工作得很好,但是当它设置为true时它不能正常工作;

frame = new JFrame("Name of the frame"); // main frame
frame.setAlwaysOnTop(false);
frame.setSize(width, height);
frame.add(canvas);
frame.setUndecorated(true);
frame.setVisible(true);

menu = new MenuUI(); // this is also a undecorated JFrame

菜单由鼠标事件调用,但有时会显示在前面,有时会显示在主框架的后面...

public static void checkMove(int action, MouseEvent e) {
    int x = e.getX();
    if(x == 0){
        menu.setVisible(true);
        menu.toFront();
    }else{
        menu.setVisible(false);
    }

我试过frame.toBack();,但它也将框架发送到其他所有内容...... 如何将未修饰的JFrame放在另一个未修饰的JFrame前面并使其保持一致?

编辑:菜单框在鼠标事件中消失

contentPane.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseExited(MouseEvent e) {
            setVisible(false);
        }
    }); 

EDIT2:在mKorbel的回答之后,我试图创建一个JDialog,但是我得到了与JFrame相同的结果。如果扩展JDialog,如何设置父级?

package menu;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JDialog;

import openGL.main.openGLMain;

@SuppressWarnings("serial")
public class menuTest extends JDialog {

public menuTest() {
    setUndecorated(true);
    setBounds(0, 0, 250, frame.getHeight());
    GroupLayout groupLayout = new GroupLayout(getContentPane());
    groupLayout.setHorizontalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addGap(0, 450, Short.MAX_VALUE)
    );
    groupLayout.setVerticalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addGap(0, 700, Short.MAX_VALUE)
    );
    getContentPane().setLayout(groupLayout);
    getContentPane().addMouseListener(new MouseAdapter() {
        @Override
        public void mouseExited(MouseEvent e) {
                setVisible(false);
        }
    });
}
}

2 个答案:

答案 0 :(得分:6)

答案 1 :(得分:0)

默认情况下,JFrame永远不会对AlwaysOnTop或toFront做出正确反应,不是主要顶级容器的主要功能(没有iconify和deiconify,但随后在屏幕上闪烁)

你必须使用JDialog来完成这项工作,设置为父和模态(如果需要)


确切地说,您也可以使用JinternalFrame,使您在主Jframe中拥有一些子框架,并且可以图标化和取消图标化或关闭哪些不需要,并且如果需要也可以使它们可调整大小。 如果你想让它们在前面或后面给别人,你可以通过拖拽那些框架儿童来轻松制作它!