【问题标题】:Java component deployment using JPanel使用 JPanel 部署 Java 组件
【发布时间】:2018-04-17 11:33:15
【问题描述】:

我想要这样的组件部署:

我编写了一个代码,在一个 JFrame 中创建了两个 JPanel,并将组件 JPanel 放在左侧。我将 Frame Layout 设置为 BorderLayout,将每个面板的 Layout 设置为 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);     
    }
}

【问题讨论】:

  • 代码很难使用,因为字符不能很好地传输到我的 IDE,结果是每个字符都“丢失字符”。这些图像令人困惑,因为第一个描绘了两个单选按钮,第二个有三个复选框。应该是哪个?
  • 不要手动操作。使用一些支持 Swing 的 GUI(例如 NetBeans),您可以在其中轻松调整布局。对于这样的任务,使用可以调整每个单元格的 GridBagLayout 非常有用。
  • 如果您只想完成此布局,Don't do it by hands" 是一个很好的建议。如果您想学习构建 swing gui,这是一个的建议。

标签: java swing layout-manager


【解决方案1】:

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

搜索面板添加到JFrameNORTH,主面板添加到JFrameCENTER。主面板是所有其他 gui 组件的容器。在代码中查看更多信息。
这是演示该策略的骨架。注意 cmets:

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

【讨论】:

  • 谢谢。你的回答很有帮助。但是,组件仍然出现在一行中。
  • 您的评论表明您没有研究我的答案。我只添加了 应该 出现在一行中的search 组件。我的回答并不是要给你提供完整的解决方案,而是给你指路。
【解决方案2】:

要制作这样的东西,请使用 NetBeans(或其他有助于创建布局的工具)。

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

在我个人看来,就大多数基于 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

【讨论】:

  • 我很赞同你的建议。
  • 如果您只想完成此布局,这是一个很好的建议。如果您想学习构建 swing gui,这是一个不好的建议。
  • 引用自己的话 ;) “在我个人看来……” :)
猜你喜欢
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2014-07-03
  • 2015-02-13
  • 2011-03-17
  • 2014-09-09
  • 1970-01-01
  • 2014-10-04
相关资源
最近更新 更多