フォームにチェックボックスがあり、それらを1行で接続します。これを行う簡単な方法がいくつかありますか?私はWindowBuilderを使用しているので、フォームサイズが変わるとオブジェクトが動き回る可能性があるので、単に画面にグラフィックを置くことはできません。Java Eclipseの2つのJCheckBoxオブジェクトの間に線を描画します。WindowBuilder
具体的には、ダイヤモンドパターンのベースボールを表す4つのチェックボックスがあります。それらを結ぶ基線パスを直線にしたい。
フォームにチェックボックスがあり、それらを1行で接続します。これを行う簡単な方法がいくつかありますか?私はWindowBuilderを使用しているので、フォームサイズが変わるとオブジェクトが動き回る可能性があるので、単に画面にグラフィックを置くことはできません。Java Eclipseの2つのJCheckBoxオブジェクトの間に線を描画します。WindowBuilder
具体的には、ダイヤモンドパターンのベースボールを表す4つのチェックボックスがあります。それらを結ぶ基線パスを直線にしたい。
だから、基本的な考え方は次のとおりです。
これは、JCheckBox
を同じコンポーネント/コンテナに含める必要があることを示唆しています。これにより、操作が簡単になります。そこから
、あなたは、コンポーネントのpaintComponent
メソッドをオーバーライドして、ソースとターゲットコンポーネント/チェックボックスの中心位置を計算し、例えば
の間に線を引くと思います...
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
これは良いことですが、野球のダイヤモンドでは実際には機能しません。フォームのサイズを変更すると、ボックスが移動して正方形にならなくなります。全体が正方形の寸法を保持する必要があります。 –
@MichaelT次に、レイアウトマネージャを変更するか、または2つ以上を組み合わせて、 'TestPane'のサイズを変更しないようにします – MadProgrammer
* "いいえ、これを行う簡単な方法はありますか?" - - いいえ – MadProgrammer
時間をかけて考えると、基本的にコンポーネントが必要ですおそらく 'JPanel')、' paintComponent'メソッドをオーバーライドしてコンポーネント間に線を引く必要があります。コンポーネントを結合する順序を指定する必要があるかもしれません。 – MadProgrammer
これは自分のスキルレベル以上の音です。おそらく、より良いアプローチは、さまざまな可能性のためにダイヤモンドの複数の写真を作成し、どの塩基が占有されているかに基づいて適切な方法を表示することです。 –