2017-12-30 70 views
0

フォームにチェックボックスがあり、それらを1行で接続します。これを行う簡単な方法がいくつかありますか?私はWindowBuilderを使用しているので、フォームサイズが変わるとオブジェクトが動き回る可能性があるので、単に画面にグラフィックを置くことはできません。Java Eclipseの2つのJCheckBoxオブジェクトの間に線を描画します。WindowBuilder

具体的には、ダイヤモンドパターンのベースボールを表す4つのチェックボックスがあります。それらを結ぶ基線パスを直線にしたい。

+1

* "いいえ、これを行う簡単な方法はありますか?" - - いいえ – MadProgrammer

+0

時間をかけて考えると、基本的にコンポーネントが必要ですおそらく 'JPanel')、' paintComponent'メソッドをオーバーライドしてコンポーネント間に線を引く必要があります。コンポーネントを結合する順序を指定する必要があるかもしれません。 – MadProgrammer

+0

これは自分のスキルレベル以上の音です。おそらく、より良いアプローチは、さまざまな可能性のためにダイヤモンドの複数の写真を作成し、どの塩基が占有されているかに基づいて適切な方法を表示することです。 –

答えて

2

だから、基本的な考え方は次のとおりです。

  • あなたは部品の中心位置を計算できるようにする必要があり、それはあなたが描くことができるように何らかの方法必要がある親コンテナ
  • 内の位置です基づいてコンポーネントの下に配置されているので、線はその上にレンダリングされます。

これは、JCheckBoxを同じコンポーネント/コンテナに含める必要があることを示唆しています。これにより、操作が簡単になります。そこから

、あなたは、コンポーネントのpaintComponentメソッドをオーバーライドして、ソースとターゲットコンポーネント/チェックボックスの中心位置を計算し、例えば

の間に線を引くと思います...

Connected points

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Point; 
import java.awt.Rectangle; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JCheckBox[] checkBoxes; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.fill = gbc.BOTH; 
      gbc.weightx = 1; 
      gbc.weighty = 1; 

      checkBoxes = new JCheckBox[4]; 
      for (int index = 0; index < 4; index++) { 
       checkBoxes[index] = new JCheckBox(); 
       checkBoxes[index].setOpaque(false); 
       checkBoxes[index].setHorizontalAlignment(JCheckBox.CENTER); 
      } 

      // Base 
      gbc.gridx = 1; 
      gbc.gridy = 2; 
      add(checkBoxes[0], gbc); 

      // First 
      gbc.gridx = 2; 
      gbc.gridy = 1; 
      add(checkBoxes[1], gbc); 

      // Second 
      gbc.gridx = 1; 
      gbc.gridy = 0; 
      add(checkBoxes[2], gbc); 

      // Third 
      gbc.gridx = 0; 
      gbc.gridy = 1; 
      add(checkBoxes[3], gbc); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     protected Point center(Rectangle bounds) { 
      Point point = new Point(); 
      point.x = bounds.x + (bounds.width/2); 
      point.y = bounds.y + (bounds.height/2); 
      return point; 
     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      Point from = center(checkBoxes[0].getBounds()); 
      for (int index = 1; index < checkBoxes.length; index++) { 
       Rectangle bounds = checkBoxes[index].getBounds(); 
       Point to = center(bounds); 
       g2d.drawLine(from.x, from.y, to.x, to.y); 
       from = to; 
      } 
      Point to = center(checkBoxes[0].getBounds()); 
      g2d.drawLine(from.x, from.y, to.x, to.y); 
      g2d.dispose(); 
     } 

    } 

} 

警告:スイングでの塗りの仕方のため、子コンポーネントが更新/再描画されるとき、親コンポーネントは通知/塗りつぶされない可能性があります。したがって、線の位置に影響する可能性のある子コンポーネントの変更は、親コンポーネントのrepaintも強制的に変更する必要があります。

そして、いいえ、これはWindow Builder

+0

これは良いことですが、野球のダイヤモンドでは実際には機能しません。フォームのサイズを変更すると、ボックスが移動して正方形にならなくなります。全体が正方形の寸法を保持する必要があります。 –

+1

@MichaelT次に、レイアウトマネージャを変更するか、または2つ以上を組み合わせて、 'TestPane'のサイズを変更しないようにします – MadProgrammer

関連する問題