2

我的问题是在理解这个简单的代码方面可能是非常基本的。我自己编写了这段代码,从这里和那里抓取一些代码来理解。我想实际上逐行遵循此代码,以了解每行的含义?我已将我的理解添加为代码行上方的注释,这可能是错误的,或者其中一些标记为****意味着我只是不知道这意味着什么。如果你能在这里帮助我,那就太好了。谢谢

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.text.ParseException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TestingSwingComponents {

    public TestingSwingComponents() {
        //Create a frame which is the window that pops up
        JFrame myframe = new JFrame();
        //*****
        myframe.getContentPane().setLayout(new BorderLayout());
        //set the frame size to be 600 X 600 size
        myframe.setSize(600, 600);

        // create Pane1
        JPanel myPanel = new JPanel();
        //set the Layout component of Panel, as how you would like it to be
        //here it is 2 rows and 15 columns
        myPanel.setLayout(new GridLayout(2, 15));
        //create a button with text in it
        JButton letterButton = new JButton("click Me");
        //add the created button component to the panel
        myPanel.add(letterButton);
        //******
        myframe.getContentPane().add(myPanel, BorderLayout.SOUTH);

        // create another panel
        JPanel panelFormat = new JPanel();
        //create a textfield
        JTextField txtfield = new JTextField();
        //create a label for the textfield
        JLabel label = new JLabel("Guesss");
        //set the layout type for this panel
        panelFormat.setLayout(new BorderLayout());
        //add label to panel
        panelFormat.add(label);
        //add textfield to panel
        panelFormat.add(txtfield);
        //I dont know the difference between the below two
        //BorderLayout.CENTER still does not center the panel in the frame, I dont know why
        myframe.getContentPane().add(panelFormat, BorderLayout.CENTER);
        myframe.add(panelFormat);

        // default settings
        myframe.setTitle("Get buttons");
        myframe.setVisible(true);
        myframe.setLocationRelativeTo(null);
        myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) throws ParseException {
        new TestingSwingComponents();
    }
}
4

3 回答 3

3

一个 Swing 顶级容器,包括一个 JFrame,JDialog 由几个组件组成,这些组件全部结合在一起,包括一个将所有组件结合在一起的 JRootPane、一个 JLayeredPane 和一个 contentPane,后者包含除顶部窗口栏之外的大部分 GUI。您可以在此处阅读有关本教程详细信息的更多信息:顶级容器

在此处输入图像描述

在此处输入图像描述

因此,当您以默认方式将组件添加到 JFrame 时,实际上是将其添加到其 contentPane 中。换句话说,这:

myJFrame.add(myComponent);

在功能上与此相同:

myJFrame.getContentPane().add(myComponent);
于 2013-10-16T02:36:53.773 回答
3
myframe.getContentPane().setLayout(new BorderLayout());

要回答这个问题,您需要了解 Swing 窗口的结构。一个JFrame(实际上是任何 Swing 窗口)由一系列生成窗口视图的组件组成。

在此处输入图像描述

(图片来自如何使用根窗格

AJRootPane构成了视图的底部,其顶部是 aJLayeredPane和所谓的“玻璃板”。JLayeredPane负责管理和“JMenuBar内容窗格”。

内容窗格是组件驻留在窗口中的位置。

所以,这条线的意思是,“获取框架的内容窗格并将其布局设置为使用BorderLayout

布局 API 本身就是一个完整的问题,您可以阅读在容器中布局组件以获得更深入的描述,但基本上,布局管理器无需您关心(很多)关于不同系统所使用的渲染技术的差异......

//******
myframe.getContentPane().add(myPanel, BorderLayout.SOUTH);

这又回到了布局管理器。因为您可以拥有任意数量的布局管理器,Swing 允许您在添加组件时将“约束”传递给布局管理器,让布局管理器了解您可能希望如何添加此组件。

如果您仔细观察,BorderLayout您会发现它有五个可以添加组件的位置。

在此处输入图像描述

该行基本上是说,“请添加myPanelSOUTH框架/内容窗格中的位置”

从评论更新

如果你看看这个片段......

panelFormat.setLayout(new BorderLayout());
//add label to panel
panelFormat.add(label);
//add textfield to panel
panelFormat.add(txtfield);

它将布局管理器设置panelFormatBorderLayoutBorderLayout在它的五个可用位置中的任何一个中只能有一个组件。当您使用add(Component)而不传递布局约束时,BorderLayout将其CENTER用作默认位置,这意味着您正在尝试将两个组件添加到该CENTER位置,这是不可能的,因此BorderLayout只需使用添加的最后一个组件。

为什么不使用边框布局修复文本字段的大小而不是拉伸所有窗口

因为这是BorderLayout工作方式,不,GridLayout可能会做一些类似的事情。

您可以尝试FlowLayoutGridBagLayout

从评论更新

你真的需要花时间阅读链接的(和其他建议的)教程......但基本上,你可以GridBagLayout像使用任何其他布局一样使用它,创建它的实例并将其应用于容器......

在此处输入图像描述

// create another panel
JPanel panelFormat = new JPanel();
//create a textfield
JTextField txtfield = new JTextField(10);
//create a label for the textfield
JLabel label = new JLabel("Guesss");
//set the layout type for this panel
panelFormat.setLayout(new GridBagLayout());
//add label to panel
panelFormat.add(label);
//add textfield to panel
panelFormat.add(txtfield);
//I dont know the difference between the below two
//BorderLayout.CENTER still does not center the panel in the frame, I dont know why
myframe.getContentPane().add(panelFormat, BorderLayout.CENTER);
myframe.add(panelFormat);
于 2013-10-16T02:38:48.987 回答
0

为了学习 Swing,我使用了这个很棒的教程,它涵盖了你所拥有的一切,并且非常深入地解释了它。

本教程还介绍了您难以理解的元素。

这里说教程。

于 2013-10-16T02:28:42.617 回答