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