2017-08-28 117 views
0

我試圖創建一個簡單的Java GUI應用程序,我可以放置端口,開關和天線。然後,我想通過多個交換機來映射端口輸出的位置,這些交換機將在GUI中進行更改。將絕對佈局組合成標準佈局

看到下圖是使用絕對座標在JFrame上繪製的自定義創建對象(端口,電纜,開關和天線)覆蓋JPanel容器。

在Netbeans中,我創建了一個表單,我想將絕對框架和表單結合在一起,形成一個完整的表單。

我已經做了一些搜索和它所有開始不使用絕對佈局。我的問題是我應該使用什麼佈局?我期望使用20多個交換機,10多個端口,甚至更多的電纜連接所有其他面板(非Planer)的交叉設備。

我可以使用絕對座標創建一個面板,然後用不同的佈局管理器將它嵌入到表單中嗎?

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

另請參閱[JMCAD](https://sourceforge.net/projects/jmcad/)。 – trashgod

+0

該圖像(左側)看起來不像組件放置在面板上,而更像是自定義繪製的面板。所以最好的方法可能是使用自定義繪畫,並重寫首選大小的方法來返回合理的大小。可以通過將所有形狀添加在一起來計算該大小,然後獲得最終形狀的邊界。 **返回適當的大小後,可以使自定義繪製的組件與佈局管理器一起使用。** –

+0

爲了更快地獲得更好的幫助,請發佈[MCVE]或[簡短,獨立,正確的示例](http:// www。 sscce.org/)。 –

回答

2

您可以將視圖組合在一起。例如,使用BorderLayout創建JPanel,使用BorderLayer.CENTER添加帶絕對佈局的面板,並將您的netbeans生成表格添加爲BorderLayout.LINE_END。 或者,您可以使用splitter view

+0

一個基本的例子顯示在這裏(https://stackoverflow.com/a/2561540/230513)。 – trashgod

+0

*「..用'BorderLayer.CENTER'將* *的絕對佈局添加到它。*。然後'pack()'頂層容器查看絕對佈局收縮爲0的大小。 –

+0

你不需要使用'pack()'。你可以設置'JFrame'的大小。或者,在'null'佈局面板上使用'setSize()','setMinimumSize()'和'setPreferredSize()'來防止'pack()'將它縮小爲空。 – AJNeufeld