如何用边框包围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