Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA-将面板添加到框架中_Java_Swing_Jframe - Fatal编程技术网

JAVA-将面板添加到框架中

JAVA-将面板添加到框架中,java,swing,jframe,Java,Swing,Jframe,我目前的框架有问题。 我试图将一个面板添加到一个框架中,但它会打开两个不同的窗口,如何修复? 我希望按钮和面板在框架中 public class MenuSample extends JFrame{ 在不同窗口中打开的面板和按钮 private JButton button; private JPanel panel; public MenuSample () { Frame testFrame = new Frame("Test Frame"); testFr

我目前的框架有问题。 我试图将一个面板添加到一个框架中,但它会打开两个不同的窗口,如何修复? 我希望按钮和面板在框架中

public class MenuSample extends JFrame{
在不同窗口中打开的面板和按钮

 private JButton button;
 private JPanel panel;

   public MenuSample () {
     Frame testFrame = new Frame("Test Frame");
     testFrame.addWindowListener(new WindowAdapter () {
         public void windowClosing (final WindowEvent e)
         {
            System.exit(0);
         }
     });
     testFrame.setMenuBar(this.getMenubar());
     testFrame.setSize(500,300);
     testFrame.setLocation(400,300);
     testFrame.setVisible(true);
应该在框架中的面板和按钮

     panel = new JPanel(new GridLayout(1,1));
     button = new JButton("erster Button");

     panel.add(button);

     getContentPane().add(panel);

     pack();
     setVisible(true);

  }

  protected MenuBar getMenubar () {
    some irrelevant MenuBar stuff

    menuLeiste.add(...);
    return menuLeiste;
  }
}
。。。它会打开两个不同的窗口,如何修复

原因是您正在创建两个不同的主窗口,一个是
JFrame
(请注意,
MenuSample
classa
JFrame
),另一个是
Frame
。或者使用
MenuSample
本身作为顶级
JFrame
或者委托给一个单独的框架-根据下面的评论,我的假设是您希望使用委托方法,所以只需这样做即可

import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class MenuSample {

    private JFrame testFrame = new JFrame("Test Frame");
    private JButton button = new JButton("erster Button");
    private JPanel panel = new JPanel(new GridLayout(1, 1)) {
        private static final long serialVersionUID = 1L;

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 300);
        }
    };

    public MenuSample() {
        panel.add(button);

        testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        testFrame.add(panel);
        testFrame.pack();
        testFrame.setLocation(400, 300);
        testFrame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MenuSample();
            }
        });
    }
}
注:

  • 注意在
    main()
    方法中启动UI的方式。这是为了避免并发问题(请参阅)

  • 不要添加WindowListener,只需将
    JFrame
    defaultCloseOperation
    设置为
    EXIT\u ON\u CLOSE
    ,以确保应用程序在
    JFrame
    关闭时终止。看

  • >p>如果这是一个新的应用程序,您可能会考虑<代码> javaFx而不是<代码> Swing >

。。。它会打开两个不同的窗口,如何修复

原因是您正在创建两个不同的主窗口,一个是
JFrame
(请注意,
MenuSample
classa
JFrame
),另一个是
Frame
。或者使用
MenuSample
本身作为顶级
JFrame
或者委托给一个单独的框架-根据下面的评论,我的假设是您希望使用委托方法,所以只需这样做即可

import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class MenuSample {

    private JFrame testFrame = new JFrame("Test Frame");
    private JButton button = new JButton("erster Button");
    private JPanel panel = new JPanel(new GridLayout(1, 1)) {
        private static final long serialVersionUID = 1L;

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 300);
        }
    };

    public MenuSample() {
        panel.add(button);

        testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        testFrame.add(panel);
        testFrame.pack();
        testFrame.setLocation(400, 300);
        testFrame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MenuSample();
            }
        });
    }
}
注:

  • 注意在
    main()
    方法中启动UI的方式。这是为了避免并发问题(请参阅)

  • 不要添加WindowListener,只需将
    JFrame
    defaultCloseOperation
    设置为
    EXIT\u ON\u CLOSE
    ,以确保应用程序在
    JFrame
    关闭时终止。看

  • >p>如果这是一个新的应用程序,您可能会考虑<代码> javaFx而不是<代码> Swing >


您已经在框架内正确添加了新面板。你的问题不在那里。您有两个窗口的原因是您正在创建两个框架:

MenuSample extends JFrame
创建菜单示例将创建一个Swing窗口,因为它是一个
JFrame

Frame testFrame = new Frame("Test Frame");
创建
新帧(…)
将创建一个AWT窗口

要仅创建一个窗口,您需要:

  • 删除“extends JFrame”并将所有内容添加到
    testFrame

  • 移除
    帧testFrame=新帧(“测试帧”)
    并将所有内容添加到此


您已经在框架内正确添加了新面板。你的问题不在那里。您有两个窗口的原因是您正在创建两个框架:

MenuSample extends JFrame
创建菜单示例将创建一个Swing窗口,因为它是一个
JFrame

Frame testFrame = new Frame("Test Frame");
创建
新帧(…)
将创建一个AWT窗口

要仅创建一个窗口,您需要:

  • 删除“extends JFrame”并将所有内容添加到
    testFrame

  • 移除
    帧testFrame=新帧(“测试帧”)
    并将所有内容添加到此


混合AWT和Swing组件有什么原因吗?此外,如果菜单栏之类的东西与问题无关,请将其删除-理想情况下,提供一个示例,说明混合AWT和Swing组件的原因是什么?此外,如果菜单栏之类的东西与问题无关,请将其删除-理想情况下,请对答案表示感谢,但我正在尝试将面板的内容整合到我的框架中。你的方法只是删除我的框架和菜单栏。如果我错了,请纠正我,但是面板不是css中用于将框架划分为不同面板的“div”的等价物吗?好吧,在任何情况下,您都有两个框架-您需要选择一个备选方案,要么从JFrame继承,要么委托给JFrame。这两个都做了(另外,其中一个是AWT框架),所以最后有两个顶层窗口。这就是我删除其中一个的原因,但是我已经更新了我的答案以显示替代方案(还要注意如何启动Swing应用程序以避免并发问题)。我删除了菜单栏,因为它与问题无关。如果这是一个新的应用程序,您可能会考虑JavaFX而不是Swing。并且,是的,在HTML(不是CSS,BTW)和 JPanel < /代码>中都是代码> div/<代码>,这些容器可以用来布局子组件。谢谢您的回答,但是我试图将面板的内容集成到我的框架中。你的方法只是删除我的框架和菜单栏。如果我错了,请纠正我,但是面板不是css中用于将框架划分为不同面板的“div”的等价物吗?好吧,在任何情况下,您都有两个框架-您需要选择一个备选方案,要么从JFrame继承,要么委托给JFrame。这两个都做了(另外,其中一个是AWT框架),所以最后有两个顶层窗口。这就是我删除其中一个的原因,但是我已经更新了我的答案以显示替代方案(还要注意如何启动Swing应用程序以避免并发问题)。我删除了菜单栏,因为它与问题无关。如果这是一个新的应用程序,您可能会考虑JavaFX而不是Swing。而且,是的,HTML(不是CSS,BTW)和 jPuth[/Cord]都是用于布局子组件的容器。谢谢您解释我的错误,它现在正在工作(谢谢您解释我的错误,它现在正在工作):