有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用JPanel进行swing Java组件部署

我希望组件部署如下图所示:

我编写了一段代码,在JFrame中生成两个JPanel,并将组件JPanel放在左侧。我将框架布局设置为BorderLayout,将每个面板的布局设置为FlowLayout。然而,结果并不是我想要的。即使列表不显示

结果图片:

你能告诉我怎么办吗

下面有一个代码

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

共 (2) 个答案

  1. # 1 楼答案

    解决复杂计算任务的常用策略是将它们分解为小的、定义良好的可管理任务。分而治之
    这也适用于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);
        }
    }
    

    更多应用此策略的示例:123

  2. # 2 楼答案

    要做到这一点,可以使用NetBeans(或其他帮助您创建布局的工具)

    在NetBeans中,获得想要的东西大约需要5分钟。这比为自己编写代码要容易得多

    enter image description here

    在我个人看来,对于大多数基于Swing的组件来说,GridBagLayout是最好的选择。您可以轻松地控制每个单元(它是否应该生长,锚应该如何运行,组件是否应该填充单元,等等)

    看看这里:https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

    如果你不知道哪种布局最适合你,你可以看看这里:

    https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

    关于NetBeans教程,请看这里:https://netbeans.org/kb/docs/java/quickstart-gui.html