Java 将绝对布局合并为标准布局

Java 将绝对布局合并为标准布局,java,swing,layout,layout-manager,Java,Swing,Layout,Layout Manager,我正在尝试创建一个简单的JavaGUI应用程序,在这里我可以放置端口、交换机和天线。然后我想映射端口的输出通过多个交换机传输到的位置,这些交换机将在GUI中更改 下图是使用绝对坐标在JFrame上绘制的覆盖JPanel容器的自定义对象(端口、电缆、交换机和天线) 在Netbeans中,我创建了一个表单,我希望将绝对帧和表单组合在一起,形成一个完整的表单 我做了一些搜索,一切都从不要使用绝对布局开始。我的问题是我应该使用什么布局?我预计将使用20多个交换机、10多个端口,甚至更多的电缆连接将要跨

我正在尝试创建一个简单的JavaGUI应用程序,在这里我可以放置端口、交换机和天线。然后我想映射端口的输出通过多个交换机传输到的位置,这些交换机将在GUI中更改

下图是使用绝对坐标在
JFrame
上绘制的覆盖
JPanel
容器的自定义对象(端口、电缆、交换机和天线)

在Netbeans中,我创建了一个表单,我希望将绝对帧和表单组合在一起,形成一个完整的表单

我做了一些搜索,一切都从不要使用绝对布局开始。我的问题是我应该使用什么布局?我预计将使用20多个交换机、10多个端口,甚至更多的电缆连接将要跨越所有其他面板(非平面)的所有设备

我是否可以使用绝对坐标创建面板,然后使用其他布局管理器将其嵌入表单中

package SystemDiagram;

import java.awt.Point;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.JFrame;
import javax.swing.JPanel;



public class SystemDiagram {

Callbox callBox;    //Callbox
Switch swi;      //Switches
HashMap<String,Cable> cables = new HashMap<>();         //Cables
Antenna downlinkAntenna;
Form control;
JFrame f;
JPanel diagram;

public static void main(String args[]) {

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new SystemDiagram();

        }
    });
}

public SystemDiagram() {
    intializeContainers();
    createElements();
}

private void intializeContainers(){
    control = new Form();   //unused until I can combine it with f JFrame as a JPanel
    diagram = control.getDiagramPanel();//unused was trying to draw callbox, switches, and antenna's on this JPanel of the Netbeans form
    f = new JFrame();   //needs to turn into a JPanel and be added to control Form object
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setSize(1000, 800);
}


private void createElements()
{     
    //output
    callBox = new Callbox("OUT", new Point (0,100));

    cables.put("c1", new Cable("c1"));
    cables.put("c2", new Cable("c2"));
    cables.put("c3", new Cable("c3"));

    callBox.setOutputCable(cables.get("c1"));

    //CA Combiner
    swi = new Switch("1 to 3 Switch", 3, new Point(345, 140),true);// Name, # ouf output ports, top left point of Jpanel, reversed 
    //Output side   
    swi.setOutputCable(1, cables.get("c2"));
    swi.setOutputCable(2, cables.get("c3"));
    //Input side
    swi.setInputCable(cables.get("c1"));
    //Activate Output
    swi.setActiveOutput(2);

    //DL Antenna
    downlinkAntenna = new Antenna("link", new Point(500,320), "spiral", true);
    downlinkAntenna.setOutputCable(cables.get("c3"));



}


private void packComponents()
{
    //Callboxes/Ports
    f.add(callBox.getGraphic());// add callbox graphic (JPanel) to Frame
    f.pack();
    f.add( swi.getGraphic());// add switch graphic (JPanel) to Frame
    f.pack();
    //Cables
    ArrayList<String> cableKeys = new ArrayList<>(cables.keySet());
    for(String key: cableKeys){
        if(cables.get(key).getConnections() == 2)// if a cable is connected on both ends draw its' graphic
        {
            Cable temp = cables.get(key);
            temp.getGraphic().setPoint(0,temp.getFirstConnection().getPortCoordinate((Component)temp));// Sets first point coordinate of cable
            temp.getGraphic().setPoint(1,temp.getSecondConnection().getPortCoordinate((Component)temp));// Sets 2nd point of cable
            f.add(cables.get(key).getGraphic());
            f.pack();
        }
    }
    //Antenna pack
    f.add(downlinkAntenna.getGraphic());// add antenna JPanel to Frame
    f.pack();
    f.setVisible(true);
}
}
包装系统图;
导入java.awt.Point;
导入java.util.ArrayList;
导入java.util.HashMap;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类系统图{
Callbox Callbox;//Callbox
开关swi;//开关
HashMap电缆=新建HashMap();//电缆
天线下行链路天线;
表单控制;
jf框架;
JPanel图;
公共静态void main(字符串参数[]){
/*创建并显示表单*/
invokeLater(new Runnable()){
公开募捐{
新系统图();
}
});
}
公共系统图(){
初始化容器();
createElements();
}
私有无效初始化容器(){
control=new Form();//未使用,直到我可以将它与f JFrame组合为JPanel
diagram=control.getDiagramPanel();//unused试图在Netbeans表单的这个JPanel上绘制调用框、开关和天线
f=new JFrame();//需要转换为JPanel并添加到控件窗体对象中
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 设置大小(1000800);
}
私有void createElements()
{     
//输出
调用框=新调用框(“输出”,新点(0100));
电缆。放置(“c1”,新电缆(“c1”);
电缆。铺设(“c2”,新电缆(“c2”);
电缆。铺设(“c3”,新电缆(“c3”);
callBox.setOutputCable(cables.get(“c1”));
//CA组合器
swi=新交换机(“1到3交换机”,3,新点(345140),真);//名称,#ouf输出端口,Jpanel左上点,反转
//输出端
swi.setOutputCable(1,cables.get(“c2”));
swi.setOutputCable(2,cables.get(“c3”));
//输入端
swi.setInputCable(cables.get(“c1”));
//激活输出
swi.setActiveOutput(2);
//DL天线
下行链路天线=新天线(“链路”,新点(500320),“螺旋”,真);
下行链路天线.setOutputCable(cables.get(“c3”));
}
专用void packComponents()
{
//呼叫箱/端口
f、 add(callBox.getGraphic());//将callBox图形(JPanel)添加到框架
f、 包装();
f、 add(swi.getGraphic());//将开关图形(JPanel)添加到框架
f、 包装();
//电缆
ArrayList cableKeys=新的ArrayList(cables.keySet());
用于(字符串键:cableKeys){
if(cables.get(key).getConnections()==2)//如果电缆两端连接,则绘制其“图形”
{
电缆温度=电缆获取(键);
temp.getGraphic()设定点(0,temp.getFirstConnection().getPortCoordinate((组件)温度));//设置电缆的第一点坐标
temp.getGraphic()设定点(1,temp.getSecondConnection().getPortCoordinate((组件)温度));//设置电缆的第二个点
f、 添加(cables.get(key.getGraphic());
f、 包装();
}
}
//天线组
f、 添加(downlinkAntenna.getGraphic());//将天线JPanel添加到帧
f、 包装();
f、 setVisible(真);
}
}

您可以将视图组合在一起。例如,使用创建
JPanel
,使用
BorderLayer.CENTER
将具有绝对布局的面板添加到其中,并将netbeans生成的表单添加为
BorderLayout.LINE\u END

或者,您可以使用一个

您可以将视图组合在一起。例如,使用创建
JPanel
,使用
BorderLayer.CENTER
将具有绝对布局的面板添加到其中,并将netbeans生成的表单添加为
BorderLayout.LINE\u END

或者,您可以使用一个

另请参见。该图像(位于左侧)看起来不像组件放置在面板上,更像是自定义绘制的面板。因此,最好的方法可能是使用自定义绘制,并重写首选大小方法以返回合理的大小。该大小可以通过将包含的所有形状相加,然后得到最终形状的边界来计算。返回一个合适的大小将使自定义绘制组件与布局管理器一起使用。为了更好地帮助,更快地发布A或。“我已经做了一些搜索,并且都是从不使用绝对布局开始的。我的问题是我应该使用什么布局?”当然,也有“定制布局”要考虑。使用这种方法,程序员将布局逻辑封装在自定义布局中,自定义布局根据组件的大小和位置计算合理的首选大小,布局管理器使用该布局分配容器足够的空间。另请参见。该图(左侧)看起来不像是将构件放置在配电盘上,更像是自定义绘制的配电盘。因此,最好的方法可能是使用自定义绘制,并重写首选大小方法以返回合理的大小。该大小可以通过将包含的所有形状相加,然后得到最终形状的边界来计算。返回适当的大小将使自定义绘制的组件能够与布局管理器一起使用。为了更快地获得更好的帮助,请发布or。“我做了一些搜索,它都是从“不使用绝对布局”开始的。我的问题是应该使用什么布局?”