Java中swing组件的基本问题?

时间:2013-10-16 02:26:15

标签: java swing layout jpanel

我的问题在理解这个简单的代码方面可能非常基础。我自己编写了这段代码,从这里和那里了解一些代码。我想逐行跟踪这段代码,看看每行的含义是什么? 我在代码行之上添加了我的理解作为注释,它可能是错误的,或者其中一些标记为****意味着我只是不知道它意味着什么。如果你能在这里帮助我,那就太好了。 感谢

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();
    }
}

3 个答案:

答案 0 :(得分:3)

一个Swing顶级容器,包括一个JFrame,JDialog由几个组成的组件组成,包括一个整体保存在一起的JRootPane,一个JLayeredPane和一个contentPane,后者包含除顶部窗口之外的大部分GUI酒吧。您可以在此处详细了解本教程中的详细信息:Top Level Containers

enter image description here

enter image description here

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

myJFrame.add(myComponent);

在功能上与此相同:

myJFrame.getContentPane().add(myComponent);

答案 1 :(得分:3)

myframe.getContentPane().setLayout(new BorderLayout());

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

enter image description here

(图片来自How to use Root Panes

JRootPane组成了视图的基础,其顶部是JLayeredPane,所谓的“玻璃窗格”。 JLayeredPane负责管理JMenuBar和“内容窗格”。

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

所以,这一行说的是,“获取框架的内容窗格并设置它的布局以使用BorderLayout

布局API本身就是一个完整的问题,你可以通过Laying out components within a container阅读更为不同的描述,但基本上,布局管理员无需你去关注(a关于不同系统所使用的渲染技术的差异......

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

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

如果仔细查看BorderLayout,您会看到它有五个位置可以添加组件。

enter image description here

该行基本上是这样说的,“请将myPanel添加到框架/内容窗格中的SOUTH位置”

从评论中更新

如果您看一下这个片段......

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

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

  

为什么不使用borderlayout来修复文本字段的大小而不是拉伸   这一切都是窗口

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

您可以尝试FlowLayoutGridBagLayout

从评论中更新

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

enter image description here

// 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);

答案 2 :(得分:0)

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

本教程还介绍了您无法理解的元素。

Here is said tutorial.