我正在尝试创建一个简单的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);
}
}
答案 0 :(得分:2)
您可以一起撰写视图。例如,使用BorderLayout
创建send()
,使用JPanel
向您的面板添加绝对布局,并将生成的netbeans格式添加为BorderLayer.CENTER
。
或者,您可以使用splitter view。