如何用边框包围JavaSwing组件?

如何用边框包围JavaSwing组件?,java,swing,user-interface,border,Java,Swing,User Interface,Border,我正在构建一个由几个选项卡式面板组成的应用程序。在它们中的每一个上,我想放置一组由边框分隔的组件。它看起来像: |- Titled Border 1 --- [JTextField] [JComboBox] [JTextField] [JComboBox] |-------- |- Titled Border 2 --- [JTextField] [JComboBox] [JTextField] [JComboBox] |-------- ... and so forth. 当我试

我正在构建一个由几个选项卡式面板组成的应用程序。在它们中的每一个上,我想放置一组由边框分隔的组件。它看起来像:

|- Titled Border 1 ---

[JTextField] [JComboBox] [JTextField] [JComboBox]

|--------

|- Titled Border 2 ---

[JTextField] [JComboBox] [JTextField] [JComboBox]

|--------

... and so forth.
当我试图简单地向面板添加新边框(标题为border 2)时,它被添加并覆盖了第一个边框,但仍将组件保留在顶部。在一些示例中,我看到许多JPanel定义在一个框架中,每个面板都有自己的边框。这在我的情况下可能有效,但如何将这些面板添加到一个选项卡中显示

Oracle的一个教程显示了一个带有多种边框演示的选项卡式窗格。当我试图编辑它并在那里放置一个组件时,它出现在两个边界之间,而不是被包围。这是另一个对我来说不成功的选择

第二件事是,我不使用任何布局管理器,组件位置是固定的,老实说,我会保持这个设置。或者您建议在这种特定情况下使用任何布局管理器

你对如何解决这个问题有什么建议吗

编辑:似乎我还不允许附加屏幕截图,但下面是代码中负责显示边框的部分:

    lenMicro = new JPanel();
    lenMicro.setLayout(null);

    bGreyLine = BorderFactory.createLineBorder(Color.GRAY, 1, true);
    bTitled1 = BorderFactory.createTitledBorder(bGreyLine, "Length (1/2)", TitledBorder.LEFT, TitledBorder.TOP);
    lenMicro.setBorder(bTitled1);
    bTitled2 = BorderFactory.createTitledBorder(bGreyLine, "Length (2/2)", TitledBorder.LEFT, TitledBorder.TOP);
    lenMicro.setBorder(bTitled2); 
最后两行未注释时,将显示标题为“长度(2/2)”的边框。

使用时,必须为每个组件提供位置,这些组件将成为视图的一部分。因此,如果不看清楚你在做什么,就很难预测事情到底出了什么问题。尽管使用,但将消除您在视图上放置不同组件时的负担

此外,还必须为各个组件设置边界。因此,我绝不能假设您添加了一个组件,并且它出现在两个边界之间(尽管考虑到您使用绝对定位的事实,您可能在视图中为所述组件提供了错误的坐标)。请看一下这个示例代码,它可能会在这方面对您有所帮助:

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class BorderExample
{
    private JPanel topPanel;
    private JPanel centerPanel;
    private JPanel bottomPanel;
    private int hgap;
    private int vgap;
    private JTextField tfield1, tfield2;
    private JComboBox cbox1, cbox2;
    private String[] data = {"One", "Two"};

    public BorderExample()
    {
        hgap = 5;
        vgap = 5;
    }

    private void displayGUI()
    {
        JFrame frame = new JFrame("Border Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setOpaque(true);
        contentPane.setBackground(Color.WHITE);
        contentPane.setBorder(
            BorderFactory.createEmptyBorder(hgap, hgap, hgap, hgap));
        contentPane.setLayout(new BorderLayout(hgap, vgap));

        topPanel = new JPanel();
        topPanel.setOpaque(true);
        topPanel.setBackground(Color.WHITE);
        topPanel.setBorder(
            BorderFactory.createTitledBorder("Top Panel"));
        tfield1 = new JTextField(10);   
        tfield1.setBorder(
            BorderFactory.createTitledBorder(
            BorderFactory.createEtchedBorder(
                    EtchedBorder.RAISED, Color.GRAY
                    , Color.DARK_GRAY), "JTextField"));
        JPanel comboPanel = new JPanel();           
        cbox1 = new JComboBox(data);
        cbox1.setBorder(
            BorderFactory.createTitledBorder("JComboBox")); 
        topPanel.add(tfield1);  
        topPanel.add(cbox1);

        centerPanel = new JPanel(); 
        centerPanel.setOpaque(true);
        centerPanel.setBackground(Color.WHITE);
        centerPanel.setBorder(
            BorderFactory.createTitledBorder("Center Panel"));
        tfield2 = new JTextField(10);   
        tfield2.setBorder(
            BorderFactory.createLoweredBevelBorder());
        cbox2 = new JComboBox(data);
        cbox2.setBorder(
            BorderFactory.createRaisedBevelBorder());   
        centerPanel.add(tfield2);   
        centerPanel.add(cbox2);

        bottomPanel = new JPanel(); 
        bottomPanel.setOpaque(true);
        bottomPanel.setBackground(Color.WHITE);
        bottomPanel.setBorder(
            BorderFactory.createTitledBorder("Center Panel"));

        contentPane.add(topPanel, BorderLayout.PAGE_START);
        contentPane.add(centerPanel, BorderLayout.CENTER);
        contentPane.add(bottomPanel, BorderLayout.PAGE_END);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new BorderExample().displayGUI();
            }
        });
    }
}
以下是相同的输出:


好的,这就解决了我对使用布局管理器和向组件组添加边框的大部分担忧:

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import java.awt.*;

public class TestingGround extends JFrame {

private JTextField tLenUnit, tLenResult, tAreUnit, tAreResult;
private JComboBox<String> cLenInUnit, cLenOutUnit, cAreInUnit, cAreOutUnit;
private JPanel lenMicro, lenMicro1, lenMicro2, lenNormal, lenMacro, area, volume;
private Border bGreyLine, bTitled1, bTitled2;

private TestingGround() {

    setTitle("Testing Ground for an Application");
    setVisible(true);
    setResizable(true);
    setLocationRelativeTo(null);

    try {
        UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (UnsupportedLookAndFeelException e) {
        e.printStackTrace();
    }

    lenMicro = new JPanel();
    lenMicro.setLayout(new GridBagLayout());

    lenMicro1 = new JPanel();
    lenMicro1.setLayout(new GridBagLayout());

    bGreyLine = BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1, true);
    bTitled1 = BorderFactory.createTitledBorder(bGreyLine, "Length", TitledBorder.LEFT, TitledBorder.TOP);
    lenMicro1.setBorder(bTitled1);

    tLenUnit = new JTextField("0.0");
    tLenUnit.setColumns(10);
    lenMicro1.add(tLenUnit, new GBC(0, 0, 2, 1).setAnchor(GBC.WEST).setInsets(5, 5, 5, 5));

    cLenInUnit = new JComboBox<String>();
    cLenInUnit.addItem("");
    cLenInUnit.addItem("First");
    cLenInUnit.addItem("Second");
    cLenInUnit.setSelectedIndex(0);
    cLenInUnit.setPreferredSize(new Dimension(120, 25));
    lenMicro1.add(cLenInUnit, new GBC(2, 0, 3, 1));

    tLenResult = new JTextField("");
    tLenResult.setColumns(10);
    lenMicro1.add(tLenResult, new GBC(5, 0, 2, 1).setInsets(5, 5, 5, 5));

    cLenOutUnit = new JComboBox<String>();
    cLenOutUnit.addItem("First");
    cLenOutUnit.addItem("Second");
    cLenOutUnit.setSelectedIndex(1);
    cLenOutUnit.setPreferredSize(new Dimension(120, 25));
    lenMicro1.add(cLenOutUnit, new GBC(7, 0, 1, 1));

    // Area part:

    lenMicro2 = new JPanel();
    lenMicro2.setLayout(new GridBagLayout());

    bTitled2 = BorderFactory.createTitledBorder(bGreyLine, "Area", TitledBorder.LEFT, TitledBorder.TOP);
    lenMicro2.setBorder(bTitled2);

    tAreUnit = new JTextField("0.0");
    tAreUnit.setColumns(10);
    lenMicro2.add(tAreUnit, new GBC(0, 1, 2, 1).setAnchor(GBC.WEST).setInsets(5, 5, 5, 5));

    cAreInUnit = new JComboBox<String>();
    cAreInUnit.addItem("");
    cAreInUnit.addItem("One sqm");
    cAreInUnit.addItem("Two sqm");
    cAreInUnit.setSelectedIndex(0);
    cAreInUnit.setPreferredSize(new Dimension(120, 25));
    lenMicro2.add(cAreInUnit, new GBC(2, 1, 3, 1));

    tAreResult = new JTextField("");
    tAreResult.setColumns(10);
    lenMicro2.add(tAreResult, new GBC(5, 1, 2, 1).setInsets(5, 5, 5, 5));

    cAreOutUnit = new JComboBox<String>();
    cAreOutUnit.addItem("One sqm");
    cAreOutUnit.addItem("Two sqm");
    cAreOutUnit.setSelectedIndex(1);
    cAreOutUnit.setPreferredSize(new Dimension(120, 25));
    lenMicro2.add(cAreOutUnit, new GBC(7, 1, 1, 1));

    // Joining all lenMicroX panels into one:

    lenMicro.add(lenMicro1, new GBC(0, 0, 8, 1).setAnchor(GBC.FIRST_LINE_START).setInsets(5, 5, 5, 5).setIpad(10, 10));
    lenMicro.add(lenMicro2, new GBC(0, 1, 8, 1).setAnchor(GBC.LINE_START).setInsets(5, 5, 5, 5).setIpad(10, 10));

    volume = new JPanel();
    volume.setLayout(null);

    // Panel definition --begin:

    JTabbedPane tPane = new JTabbedPane();

    tPane.addTab("Length & Area", null, lenMicro, "Length & Area units");
    tPane.addTab("Volume", null, volume, "Volume units");
    add(tPane);

    // Panel --end.
}

public static void main(String[] args) {

    TestingGround app = new TestingGround();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    app.pack();
    app.setVisible(true);

}

}
import javax.swing.*;
导入javax.swing.border.border;
导入javax.swing.border.TitledBorder;
导入java.awt.*;
公共类TestingGround扩展JFrame{
私有JTextField-tLenUnit、tLenResult、tAreUnit、tAreResult;
私人JComboxCleninUnit、cLenOutUnit、cAreInUnit、cAreOutUnit;
私人JPanel lenMicro、lenMicro1、lenMicro2、lenNormal、lenMacro、面积、体积;
私人边界边界边界线,bTitled1,bTitled2;
私人试验场(){
setTitle(“应用程序的测试场”);
setVisible(真);
可设置大小(真);
setLocationRelativeTo(空);
试一试{
UIManager.setLookAndFeel(“javax.swing.plaf.nimbus.NimbusLookAndFeel”);
}catch(classnotfounde异常){
e、 printStackTrace();
}捕获(实例化异常e){
e、 printStackTrace();
}捕获(非法访问例外e){
e、 printStackTrace();
}捕获(无支持的LookandFeelException e){
e、 printStackTrace();
}
lenMicro=新的JPanel();
setLayout(新的GridBagLayout());
lenMicro1=新的JPanel();
lenMicro1.setLayout(新的GridBagLayout());
bGreyLine=BorderFactory.createLineBorder(Color.LIGHT\u GRAY,1,true);
bTitled1=BorderFactory.createTitleBorder(bGreyLine,“长度”,titleBorder.LEFT,titleBorder.TOP);
lenMicro1.订单(bTitled1);
tLenUnit=新的JTextField(“0.0”);
tLenUnit.setColumns(10);
lenMicro1.add(tLenUnit,新GBC(0,0,2,1).setAnchor(GBC.WEST).setInsets(5,5,5,5));
cLenInUnit=newjcombobox();
克莱宁单位。增补项(“”);
cLenInUnit.addItem(“第一”);
cLenInUnit.addItem(“第二”);
cLenInUnit.setSelectedIndex(0);
设置首选尺寸(新尺寸(120,25));
lenMicro1.添加(cLenInUnit,新GBC(2,0,3,1));
tLenResult=新的JTextField(“”);
t结果设置列(10);
lenMicro1.add(tLenResult,新GBC(5,0,2,1).setInsets(5,5,5,5));
cLenOutUnit=newjcombobox();
补充条款(“第一”);
补充条款(“第二条”);
cLenOutUnit.setSelectedIndex(1);
设置首选尺寸(新尺寸(120,25));
lenMicro1.add(cLenOutUnit,新GBC(7,0,1,1));
//区域部分:
lenMicro2=新的JPanel();
lenMicro2.setLayout(新的GridBagLayout());
bTitled2=BorderFactory.createTitleBorder(bGreyLine,“Area”,titleBorder.LEFT,titleBorder.TOP);
lenMicro2.订单(bTitled2);
tAreUnit=新的JTextField(“0.0”);
tAreUnit.setColumns(10);
lenMicro2.add(tAreUnit,新GBC(0,1,2,1).setAnchor(GBC.WEST).setInsets(5,5,5,5));
cAreInUnit=new JComboBox();
cAreInUnit.addItem(“”);
额外建筑面积(“一平方米”);
额外建筑面积(“两平方米”);
cAreInUnit.setSelectedIndex(0);
cAreInUnit.setPreferredSize(新尺寸(120,25));
lenMicro2.添加(cAreInUnit,新GBC(2,1,3,1));
tAreResult=newjtextfield(“”);
tAreResult.setColumns(10);
lenMicro2.add(tAreResult,新GBC(5,1,2,1).setInsets(5,5,5,5));
cAreOutUnit=new JComboBox();
cAreOutUnit.addItem(“一平方米”);
cAreOutUnit.addItem(“两平方米”);
cAreOutUnit.setSelectedIndex(1);
cAreOutUnit.setPreferredSize(新尺寸(120,25));
lenMicro2.添加(cAreOutUnit,新GBC(7,1,1,1));
//将所有lenMicroX面板连接为一个:
lenMicro.add(lenMicro1,新GBC(0,0,8,1).setAnchor(GBC.FIRST_LINE_START).setInsets(5,5,5,5).setIpad(10,10));
lenMicro.add(lenMicro2,新的GBC(0,1,8,1).setAnchor(GBC.LINE_START).setInsets(5,5,5,5).setIpad(10,10));
音量=新的JPanel();
volume.setLayout(空);
//面板定义--开始:
JTabbedPane tPane=新的JTabbedPane();
tPane.addTab(“长度和面积”,null,lenMicro,“长度和面积单位”);
tPane.addTab(“卷”,null,卷,“V