Java中swing组件的基本问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中swing组件的基本问题?相关的知识,希望对你有一定的参考价值。

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

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();
    }
}
答案
myframe.getContentPane().setLayout(new BorderLayout());

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

(图片来自How to use Root Panes

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

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

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

布局API本身就是一个完整的问题,你可以通过Laying out components within a container读取更多不同的描述,但基本上,布局管理器不需要你关心渲染中的差异(一个很大的交易)不同系统所需的技术......

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

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

如果你仔细看看BorderLayout,你会发现它有五个位置可以添加组件。

这条线基本上是说,“请将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,你创建它的实例并将其应用到容器......

// 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);
另一答案

一个Swing顶层容器,包括一个JFrame,JDialog由几个组件组成,所有组件都保存在一起,包括一个整体保存在一起的JRootPane,一个JLayeredPane和一个contentPane,后者除了顶部窗口栏之外还拥有大部分GUI。您可以在此处阅读本教程中有关详细信息的更多信息:Top Level Containers

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

myJFrame.add(myComponent);

在功能上与此相同:

myJFrame.getContentPane().add(myComponent);
另一答案

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

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

Here is said tutorial.

以上是关于Java中swing组件的基本问题?的主要内容,如果未能解决你的问题,请参考以下文章

《Java Swing》第4节:事件处理与监听器

java中经常使用的Swing组件总结

Java - Swing - 充满组件的窗口

Java Swing:居中组件

Java Swing:在 JPanel 的组件下绘制?

java Swing 编写需要用的一些常用组件,求代码~~