将Jinternalframe带到一切面前

时间:2015-01-10 16:13:24

标签: java jinternalframe

在此代码中单击新按钮时,Jinternalframe会在按钮后面,即使我添加了其他内容,例如jlabel,jtextfield等,内部框架也会打开所有内容。我尝试了tofront()和movetofront()函数,但它似乎没有用。请帮助,谢谢。

代码:

    import java.awt.BorderLayout;
import java.awt.CardLayout;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Messages2 extends JFrame {

    JFrame frame;
    JButton button1;

    public static void main(String[] args) {
        Messages2 window = new Messages2();
        window.frame.setVisible(true);
    }

    public Messages2() {

        frame = new JFrame();
        frame.getContentPane().setBackground(Color.WHITE);
        frame.setBounds(100, 100, 220, 220);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        //frame.getContentPane().setLayout(new FlowLayout());

        JButton btnNew = new JButton("New Message");
        btnNew.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                JDesktopPane desktopPane = new JDesktopPane();
                JInternalFrame intFrame = new JInternalFrame(
                        "JInternalFrame demo");

                intFrame.setMaximizable(true);
                intFrame.setIconifiable(true);
                intFrame.setResizable(true);
                intFrame.setClosable(true);
                intFrame.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);

                intFrame.setSize(320, 240);
                // intFrame.pack();
                intFrame.setVisible(true);

                desktopPane.add(intFrame);

                frame.add(desktopPane, BorderLayout.CENTER);
            }

        });
        btnNew.setBounds(1, 35, 145, 31);
        frame.getContentPane().add(btnNew);
    }
}

2 个答案:

答案 0 :(得分:1)

  

当点击新按钮时,即使我添加了jlabel,jtextfield等其他内容,Jinternalframe也会在按钮后面,

根据您在上一个问题中发布的代码(在删除之前),您尝试将所有组件直接添加到框架中。 Swing以与添加组件相反的顺序绘制组件。因此,由于最后添加了内部框架,因此首先进行涂装,然后将所有其他部件涂在其上面。

这不是你应该使用JInternalFrame的方式。您需要将JDesktopPane / JInternalFrames与其他组件分开,并分别使用它们。

阅读How to Use Internal Frames上Swing教程中的部分,了解基本信息和示例。

  1. 将内部框架添加到添加到框架的JDesktopPane。
  2. 不要对其他组件使用null布局。 Swing旨在与布局管理器一起使用。应将这些组件添加到面板中,然后将面板添加到框架中。
  3. 必须将面板和桌面窗格添加到框架的不同区域。例如:

    frame.add(panel, BorderLayout.NORTH);
    frame.add(desktopPane, BorderLayout.CENTER);
    

答案 1 :(得分:0)

您未正确使用JInternalFrame。它应该只放在JDesktopPane中,你不会做的事情,我建议你开始做。请查看appropriate tutorial on this

您的按钮和JInternalFrame现在填满了该字段,因为您正在使用JFrame的默认BorderLayout。建议:

  • 首先,解释完全您正在尝试实现的完全效果/用户体验。你确定JInternalFrame是你最好的选择吗?
  • 了解并尽量使用布局管理器。
  • 如果您要使用JInternalFrame,那么虽然可以在ActionListener中添加JInternalFrame,但您通常会想要在GUI创建时将JDesktopPane添加到GUI ,而不是在ActionListener。