私はポート、スイッチ、アンテナを配置できるシンプルな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);
}
}
[JMCAD](https://sourceforge.net/projects/jmcad/)も参照してください。 – trashgod
そのイメージ(左側)は、コンポーネントがパネルに配置されているようには見えませんが、カスタム塗装されたパネルに似ています。そのため、最適な方法は、カスタムペイントを使用し、適切なサイズのメソッドをオーバーライドして適切なサイズに戻すことです。そのサイズは、すべての図形を一緒に包含し、最終的な図形の境界を取得することによって計算することができます。 **適切なサイズを返すと、カスタム塗装されたコンポーネントをレイアウトマネージャーで使用できるようになります。** –
すぐに役立つようにするには、[MCVE]または[短く、自己完結型の正しい例](http:// www。 sscce.org/)。 –