Swing/RadioButtonsLabelAlignment の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/RadioButtonsLabelAlignment へ行く。
- Swing/RadioButtonsLabelAlignment の差分を削除
--- category: swing folder: RadioButtonsLabelAlignment title: JRadioButtonの選択アイコンを除いたテキスト先頭をJLabelと揃える tags: [JRadioButton, JLabel, GridBagLayout] author: aterai pubdate: 2023-12-11T00:16:30+09:00 description: JRadioButtonやJCheckBoxの選択アイコンを除いたテキスト先頭が垂直配置したJLabelのテキスト先頭と揃うよう配置します。 image: https://drive.google.com/uc?id=1RKs4YswczAS_MAwgDe8zfp2Cwr_et1cS --- * 概要 [#summary] `JRadioButton`や`JCheckBox`の選択アイコンを除いたテキスト先頭が垂直配置した`JLabel`のテキスト先頭と揃うよう配置します。 #download(https://drive.google.com/uc?id=1RKs4YswczAS_MAwgDe8zfp2Cwr_et1cS) * サンプルコード [#sourcecode] #code(link){{ JPanel p = new JPanel(new GridBagLayout()); p.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); p.setFocusTraversalPolicy(new ContainerOrderFocusTraversalPolicy()); p.setFocusTraversalPolicyProvider(true); p.setFocusable(false); // p.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); boolean leftToRightParent = p.getComponentOrientation().isLeftToRight(); GridBagConstraints gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridx = 1; gbc.insets.top = 5; ButtonGroup group = new ButtonGroup(); List<JComponent> list = Arrays.asList( new JRadioButton("JRadioButton1"), new JRadioButton("JRadioButton2"), new JRadioButton("JRadioButton3"), new JLabel("JLabel1"), new JLabel("JLabel2"), new JCheckBox("JCheckBox1"), new JCheckBox("JCheckBox2")); int gap = 0; for (JComponent c : list) { // c.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); gbc.insets.left = 0; gbc.insets.right = 0; if (c instanceof JRadioButton) { JRadioButton button = (JRadioButton) c; if (gap == 0) { gap = getIconSpace(button); button.setSelected(true); } group.add(button); } else if (c instanceof JLabel) { boolean leftToRight = c.getComponentOrientation().isLeftToRight(); if (leftToRight && leftToRightParent) { gbc.insets.left = gap; } else if (leftToRight) { gbc.insets.right = gap; } else if (leftToRightParent) { gbc.insets.right = gap; } else { gbc.insets.left = gap; } } p.add(c, gbc); } gbc.gridx = 2; gbc.weightx = 1.0; gbc.insets.left = 5; gbc.insets.right = 5; list.forEach(c -> p.add(new JTextField(), gbc)); }} * 解説 [#explanation] - `GridBagLayout`を使用して`JRadioButton`、`JLabel`、`JCheckBox`を垂直配置 -- `JFileChooser`の色選択パネル(`javax.swing.colorchooser.ColorPanel`)も同様に`GridBagLayout`を使用して赤・緑・青用の`JRadioButton`とアルファ用の`JLabel`を垂直配置している - `UIManager.getIcon("RadioButton.icon")`で`JRadioButton`の選択アイコンを取得し、その幅と`JRadioButton`の左余白、テキストと選択アイコンとの距離を記憶 - 選択アイコンの存在しない`JLabel`を親`JPanel`に追加する場合の制約`GridBagConstraints#insets#left`に上記の値を代入してグリッドセルの左余白を設定し、各テキスト先頭が垂直に揃うよう配置 -- `JFileChooser`の色選択パネルでは`GridBagConstraints#insets#left`ではなく`EmptyBorder`を使用して左余白を設定している -- `JColorChooser`の色選択パネルでは`GridBagConstraints#insets#left`ではなく`EmptyBorder`を使用して左余白を設定している -- `ComponentOrientation`で`GridBagLayout`のレイアウトや`GridBagConstraints#insets`の左右が入れ替わることを回避するためか? * 参考リンク [#reference] - [[JLabelの最大幅を共有して異なるパネル間で垂直位置を揃える>Swing/AlignedLabel]] * コメント [#comment] #comment #comment - 2023-12-11 #swingdescription(Swing/RadioButtonsLabelAlignment,JRadioButtonの選択アイコンを除いたテキスト先頭をJLabelと揃える,JRadioButtonやJCheckBoxの選択アイコンを除いたテキスト先頭が垂直配置したJLabelのテキスト先頭と揃うよう配置します。,https://drive.google.com/thumbnail?id=1RKs4YswczAS_MAwgDe8zfp2Cwr_et1cS) ** JRadioButtonの選択アイコンを除いたテキスト先頭をJLabelと揃える [#RadioButtonsLabelAlignment] #swingdescription(Swing/RadioButtonsLabelAlignment,JRadioButtonの選択アイコンを除いたテキスト先頭をJLabelと揃える,JRadioButtonやJCheckBoxの選択アイコンを除いたテキスト先頭が垂直配置したJLabelのテキスト先頭と揃うよう配置します。,https://drive.google.com/thumbnail?id=1RKs4YswczAS_MAwgDe8zfp2Cwr_et1cS)