将绝对布局组合成标准布局

时间:2017-08-28 22:12:18

标签: java swing layout layout-manager

我正在尝试创建一个简单的Java GUI应用程序,我可以在其中放置端口,交换机和天线。然后我想通过GUI中的多个开关来映射端口输出的位置。

请参见下图,使用绝对坐标覆盖在JPanel上绘制的JFrame容器,自定义创建的对象(端口,电缆,开关和天线)。

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

1 个答案:

答案 0 :(得分:2)

您可以一起撰写视图。例如,使用BorderLayout创建send(),使用JPanel向您的面板添加绝对布局,并将生成的netbeans格式添加为BorderLayer.CENTER。  或者,您可以使用splitter view