2017-12-30 88 views
0

양식에 몇 가지 체크 박스가 있는데 한 줄씩 연결해야합니다. 이 작업을 수행하는 쉬운 방법이 있습니까? WindowBuilder를 사용하고 있기 때문에 객체가 양식 크기가 변하면 이동할 수 있기 때문에 화면에 그래픽을 넣을 수는 없습니다.자바 이클립스 WindowBuilder에서 두 개의 JCheckBox 객체 사이에 선을 그립니다.

특히, 야구 다이아몬드에 기지를 나타내는 4 개의 체크 박스가 다이아몬드 패턴으로 있습니다. 그것들을 연결하는 기본 경로가 직선이되고 싶습니다.

+1

* "아니오 쉬운 방법이 있습니까?"* - 아니요. – MadProgrammer

+0

그것에 대해 잠시 생각을하던 중 기본적으로 구성 요소가 필요합니다 아마도'JPanel'), 당신은 그것의 'paintComponent' 메소드를 오버라이드하고 컴포넌트들 사이에 선을 그려야합니다. 구성 요소가 결합되어야하는 순서를 지정해야 할 수도 있습니다. – MadProgrammer

+0

이것은 내 기술 수준보다 높게 들립니다. 어쩌면 더 나은 접근법은 다양한 가능성을 위해 다이아몬드의 여러 사진을 찍고, 어떤 기반이 점령되었는지에 따라 적절한 것을 표시하는 것입니다. –

답변

2

그래서, 기본 개념은 다음과 같습니다

  • 당신은 그것을
  • 당신은 페인트 할 수 있도록 어떻게든지 필요로하는 부모 컨테이너 내의 위치에 따라 구성 요소의 중심 위치를 계산 할 수 있어야합니다 구성 요소 아래에 선이 맨 위에 렌더링됩니다.

이렇게하면 JCheckBox이 동일한 구성 요소/컨테이너에 포함되어야하므로 작업하기가 더 쉬워집니다.

는 여기에서, 당신은 ..., 구성 요소의 paintComponent 메소드를 오버라이드 (override) 원본 및 대상 구성 요소의 중심 위치를 계산/상자를 확인하고

예를 들어

사이에 선을 그리는 것

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(); 
     } 

    } 

} 

경고 : Swing에서 페인팅이 작동하는 방식 때문에 자식 구성 요소가 업데이트/다시 칠 때 부모 구성 요소에 알림/페인트되지 않을 수 있습니다. 따라서 행의 위치에 영향을 줄 수있는 자식 구성 요소를 변경하면 부모 구성 요소도 repaint이어야합니다.

아니요, Window Builder를 사용하여이 작업을 수행 할 수 없습니다. , 당신은이 일을 제대로하기 위해 손을 더러워해야 할 것입니다.

+0

이것은 좋지만 야구 다이아몬드에서는 실제로 작동하지 않습니다. 양식의 크기를 조정하면 상자가 이동하여 더 이상 정사각형이 아닙니다. 모든 것은 사각 치수를 유지해야합니다. –

+1

@MichaelT 그런 다음 레이아웃 관리자를 변경하거나 두 개 이상을 결합하여'TestPane'의 크기를 변경하지 않도록합니다 – MadProgrammer