使用 JPanel 部署 Java 组件

标签 java swing layout-manager

我想要像这样的图片部署组件:

我编写了一个代码,在一个 JFrame 中创建两个 JPanel 并将组件 JPanel 放在左侧。我将框架布局设置为 BorderLayout,将每个面板的布局设置为 FlowLayout。然而,结果并不是我想要的。连List都没有出现。

结果图:

你能告诉我该怎么做吗?

下面有一个代码。

package com.java.APISearch;
import java.awt.*;
import javax.swing.*;
import javax.swing.JPanel;

public class MainFrame extends JFrame {
    JPanel search;
    JPanel result;
    JLabel ksLb;
    JTextField ksTf;
    JButton ksOK;
    JCheckBox choicePackage;
    JCheckBox choiceClass;
    JCheckBox choiceFunc;
    JTextField dsTf;
    JButton dsOK;
    JLabel rcLb;
    JList<String> rcList;
    JTextField resultTf;
    Container contentPane;

    public MainFrame(String title) {
        super(title);
        Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension screenSize = tk.getScreenSize();
        setLocation(screenSize.width/2 - 300, screenSize.height/2 - 200);
        setSize(new Dimension(600, 400));
        setResizable(false);
        setLayout(new BorderLayout());
        search = new JPanel();
        result = new JPanel();
        search.setLayout(new FlowLayout(FlowLayout.LEFT));
        search.setSize(new Dimension(300,400));
        result.setLayout(new FlowLayout());
        result.setSize(new Dimension(300,400));
        contentPane = getContentPane();
        contentPane.add(search, BorderLayout.WEST);
        contentPane.add(result, BorderLayout.EAST);

        ksLb = new JLabel("키워드 검색");
        ksTf = new JTextField(20);
        ksOK = new JButton("검색");
        search.add(ksLb);
        search.add(ksTf);
        search.add(ksOK);

        choicePackage = new JCheckBox("package");
        choiceClass = new JCheckBox("class");
        choiceFunc = new JCheckBox("function");
        dsTf = new JTextField(20);
        dsOK = new JButton("검색");
        search.add(choicePackage);
        search.add(choiceClass);
        search.add(choiceFunc);
        search.add(dsTf);
        search.add(dsOK);

        rcLb = new JLabel("recent search");
        rcList = new JList<String>();
        search.add(rcLb);
        search.add(rcList);     
    }
}

最佳答案

解决复杂计算任务的常见策略是将其分解为小的、定义良好的可管理任务。分而治之。
这也适用于 gui:将设计分解为小的、易于布局的容器。
在这种情况下,例如首先将设计划分为两个区域:

enter image description here

Serach 面板添加到 JFrameNORTH,主面板添加到 JFrameCENTER 。主面板是所有其他 GUI 组件的容器。请参阅代码中的更多信息。
这是演示该策略的框架。请注意评论:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MainFrame extends JFrame {

    public MainFrame(String title) {
        super(title);
        setSize(new Dimension(600, 400));
        setResizable(false);
        //setLayout(new BorderLayout());// no need. its the default for JFrame
        JPanel search = new JPanel();
        search.setLayout(new FlowLayout(FlowLayout.LEFT));
        //search.setSize(new Dimension(300,400)); //let layout manager set size
                                                  //set preferred size if needed
        JLabel ksLb = new JLabel("Search:");
        JTextField ksTf = new JTextField(20);
        JButton ksOK = new JButton("Click Me");
        search.add(ksLb);
        search.add(ksTf);
        search.add(ksOK);
        add(search, BorderLayout.NORTH); //add search to content pane

        //construct a container to hold all the rest
        //set border layout to it
        JPanel mainPanel = new JPanel(new BorderLayout());
        //add content to mainPanel:
        //add result to NORTH 
        //add a JPanel to hold list and label to CENTER 
        add(mainPanel, BorderLayout.CENTER);//main to content pane
        setVisible(true);
    }
}
<小时/>

应用此策略的更多示例:1 23

关于使用 JPanel 部署 Java 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47117723/

相关文章:

java - 嵌套 JPanels 和 GridBagLayout 不是 "Packing"组件

java - JPanel 中的 JPanel

java - 我正在向某人现有的 Swing 代码添加一个组合框。我在这里做错了什么?

java - 将 2 组/项目在中心两侧对齐

java - 如何使用 BoxLayout 设置容器内的组件大小

java - Swing : GridBagLayout adding components not the expected way

java - 通过URI获取内容

java - Apache HttpClient 制作多部分表单帖子

java - 如何在 Android Studio 中使用 TextView 的矩形背景?

java - OSGI 的 EJB 持久性问题