2017-08-28 17 views
0

私はポート、スイッチ、アンテナを配置できるシンプルなJava GUIアプリケーションを作成しようとしています。次に、ポートの出力がGUI内で変更される複数のスイッチを経由してどこにマップされているかを調べたいと思います。標準レイアウトに絶対レイアウトを組み合わせる

以下の図は、で描画されたJPanelコンテナをオーバーライドしたカスタム作成オブジェクト(ポート、ケーブル、スイッチ、およびアンテナ)です。

Netbeansではフォームを作成しました。絶対フレームとフォームを組み合わせて1つの完全なフォームにしたいと考えています。

私はいくつかの検索を行ってきたし、それがすべてでは絶対的なレイアウトを使用していないことから始まります。私の質問はどのレイアウトを使用すべきですか?私は、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

[JMCAD](https://sourceforge.net/projects/jmcad/)も参照してください。 – trashgod

+0

そのイメージ(左側)は、コンポーネントがパネルに配置されているようには見えませんが、カスタム塗装されたパネルに似ています。そのため、最適な方法は、カスタムペイントを使用し、適切なサイズのメソッドをオーバーライドして適切なサイズに戻すことです。そのサイズは、すべての図形を一緒に包含し、最終的な図形の境界を取得することによって計算することができます。 **適切なサイズを返すと、カスタム塗装されたコンポーネントをレイアウトマネージャーで使用できるようになります。** –

+0

すぐに役立つようにするには、[MCVE]または[短く、自己完結型の正しい例](http:// www。 sscce.org/)。 –

答えて

2

ビューをまとめて構成できます。たとえば、JPanelBorderLayoutで作成し、絶対レイアウトのパネルにBorderLayer.CENTERを追加し、netbeans生成フォームをBorderLayout.LINE_ENDとして追加します。 splitter viewを使用することもできます。

+0

基本的な例がここに表示されています(https://stackoverflow.com/a/2561540/230513)。 – trashgod

+0

* "絶対レイアウトを参照するパネルを' BorderLayer.CENTER' "* .then' pack() 'で絶対レイアウトでパネルに追加すると、絶対レイアウトは0サイズに縮小されます。 –

+0

あなたは 'pack()'を使う必要はありません。あなたは 'JFrame'のサイズを設定することができます。代わりに、 'null 'レイアウトパネルで' setSize() '、' setMinimumSize() 'と' setPreferredSize() 'を使って、' pack() 'が何もしないようにします。 – AJNeufeld

関連する問題