【问题标题】:Java Swing JFrame LayoutJava Swing JFrame 布局
【发布时间】:2012-01-29 10:50:38
【问题描述】:

我刚刚编写了一个简单的代码,我希望在主框架上显示一个文本字段和一个按钮,但运行后我看到的只是文本字段。

如果我在文本字段之后编写按钮的代码,那么只会显示按钮。

知道为什么吗?

    JFrame mainframe=new JFrame();
    mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainframe.setBounds(0,0,200,200);
    JButton jb=new JButton();
    jb.setText("Leech");
    mainframe.add(jb);
    JTextField link=new JTextField(50);
    mainframe.add(link);
    mainframe.pack();
    mainframe.setVisible(true);

【问题讨论】:

  • 类 javadoc 明确指出您也可以调用 add,这会将其添加到内容窗格中。至少在更新的 Java 版本中,您参考的 1.3 文档

标签: java swing jframe jbutton layout-manager


【解决方案1】:

您也可以使用类似 Flow Layout 之类的东西,这是 JPanel 使用的默认布局。它用于将组件排列成一行或一行。例如从左到右或从右到左:

流布局将组件排列成一行,如果没有剩余空间,则所有剩余组件都转到下一行。 Align 属性决定组件的对齐方式为左、右、居中等。

要使用它,您需要使用 JFrame.setLayout(layout) 设置 JFrame 布局,并将流布局作为参数传递。

以下示例显示了按流布局排列的组件:

package example.com;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

public class FlowLayoutExample {

    FlowLayoutExample(){
        JFrame frame = new JFrame("Flow Layout");
        JButton button, button1, button2, button3, button4;
        button = new JButton("button 1");
        button1 = new JButton("button 2");
        button2 = new JButton("button 3");
        button3 = new JButton("button 4");
        button4 = new JButton("button 5");
        frame.add(button);
        frame.add(button1);
        frame.add(button2);
        frame.add(button3);
        frame.add(button4);
        frame.setLayout(new FlowLayout());
        frame.setSize(300,300);  
        frame.setVisible(true);  

    }
    public static void main(String[] args) {
        new FlowLayoutExample();
    }
}

查看learn more about JFrame layouts

【讨论】:

    【解决方案2】:

    将您的组件添加到 JPanel,然后将该面板添加到 JFrame 的 ContentPane。

    JFrame window = new JFrame();
    JPanel mainframe = new JPanel();
    
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setBounds(0,0,200,200);
    
    JButton jb = new JButton();
    jb.setText("Leech");
    
    mainframe.add(jb);
    
    JTextField link = new JTextField(50);
    mainframe.add(link);
    
    window.getContentPane().add(mainframe);
    window.pack();
    window.setVisible(true);
    

    【讨论】:

    • 这与在JFrame 上将FlowLayout 设置为LayoutManager 基本相同,因为这是JPanel 的默认布局
    • 不敢相信这是公认的答案。以下罗宾的答案是正确答案。只需要了解 JFrame 的默认布局管理器是什么,以及在 BorderLayout 中添加的默认位置(如果未指定)。
    • @Michael 你的评论有什么意义?你认为这个答案是错误的还是你不喜欢它的编码方式?
    • @Ibrahim OP 的问题是“知道为什么吗?”,你没有解释为什么他的代码不起作用,罗宾的回答解释了原因
    • @Michael 每当我问“为什么某些东西不起作用”时,我的意思是“有人可以让它为我工作”。但这就是我的想法,我认为这就是他想要的,“让按钮和文本字段都显示在窗口中”。他接受了它作为答案,因为他找到了他要找的东西。对于其他真正想知道为什么对 Robin 的答案投了赞成票的人,您可以看到他获得了更多的选票,因此您可以阅读投票最多的答案,这就是我在 stackoverflow 上所做的。
    【解决方案3】:

    如果您看到 BorderLayout 文档 mainframe.add(jb);等于 mainframe.add(jb,BorderLayout.CENTER); mainframe.add(链接);等于 mainframe.add(jb,BorderLayout.CENTER);

    所以它只显示最后一个

    【讨论】:

      【解决方案4】:

      JFrame 的默认布局管理器是 BorderLayout。如果你想要自动布局,你可以使用 FlowLayout:

      mainframe.setLayout(new FlowLayout());
      

      如果要通过setBounds()方法指定坐标,需要取消JFrame上布局管理器的设置:

      mainframe.setLayout(null);
      jb.setBounds(10,10,100,50);
      link.setBounds(10,70,180,100);
      

      【讨论】:

      • 你不应该建议将布局设置为空,这是完全错误的。
      【解决方案5】:

      JFrame 的默认布局是BorderLayout。在具有这种布局的Container 上调用add 方法等效于调用add(..., BorderLayout.CENTER)BorderLayout 的每个位置只能包含一个元素。因此打了两个电话

      mainframe.add(jb);
      mainframe.add(link);
      

      产生一个包含您添加的最后一个组件的 CENTER。如果您想避免这种情况,您可以将其添加到不同的位置,或者通过调用 JFrame#setLayout 使用另一个布局管理器(例如 FlowLayout

      【讨论】:

      • 如果你可以在框架中做到这一点,那么面板的意义何在?
      【解决方案6】:

      不要直接将组件添加到 JFrame 中,而是使用 JPanel 作为具有所需 LayoutManager 的容器。

      Here你可以找到一些关于布局管理器的教程。

      基本上,在 Swing 中,LayoutManager 负责布置子组件(确定它们的位置和大小),因此您在应用程序中使用的每个容器组件都应该使用适当的 LayoutManager 进行配置。

      【讨论】:

      • LayoutManager 上的链接现已失效。请修复。
      猜你喜欢
      • 2012-09-24
      • 1970-01-01
      • 2019-04-04
      • 2018-05-03
      • 2014-12-20
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多