그래서, 기본 개념은 다음과 같습니다
- 당신은 그것을
- 당신은 페인트 할 수 있도록 어떻게든지 필요로하는 부모 컨테이너 내의 위치에 따라 구성 요소의 중심 위치를 계산 할 수 있어야합니다 구성 요소 아래에 선이 맨 위에 렌더링됩니다.
이렇게하면 JCheckBox
이 동일한 구성 요소/컨테이너에 포함되어야하므로 작업하기가 더 쉬워집니다.
는 여기에서, 당신은 ..., 구성 요소의 paintComponent
메소드를 오버라이드 (override) 원본 및 대상 구성 요소의 중심 위치를 계산/상자를 확인하고
예를 들어
사이에 선을 그리는 것
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를 사용하여이 작업을 수행 할 수 없습니다. , 당신은이 일을 제대로하기 위해 손을 더러워해야 할 것입니다.
* "아니오 쉬운 방법이 있습니까?"* - 아니요. – MadProgrammer
그것에 대해 잠시 생각을하던 중 기본적으로 구성 요소가 필요합니다 아마도'JPanel'), 당신은 그것의 'paintComponent' 메소드를 오버라이드하고 컴포넌트들 사이에 선을 그려야합니다. 구성 요소가 결합되어야하는 순서를 지정해야 할 수도 있습니다. – MadProgrammer
이것은 내 기술 수준보다 높게 들립니다. 어쩌면 더 나은 접근법은 다양한 가능성을 위해 다이아몬드의 여러 사진을 찍고, 어떤 기반이 점령되었는지에 따라 적절한 것을 표시하는 것입니다. –