4

ここに関数があります:

/**
 * Creates an instance of a JLabel with the given arguments
 * @param text The text to be displayed on the Label
 * @param font The font of the label
 * @param bold set to true if you want the label's text to be bold
 * @param fontSize The size of the font to be rendered
 * @param alignment An alignment (E.g. CENTER_ALIGNMENT)
 * @param verticleAlignment an optional argument to allow one to choose the Y alignment
 * **/
public JLabel createLabel(String text, String font, boolean bold, int fontSize, float alignment, float...verticleAlignment){
    JLabel label = new JLabel(text);
    label.setFont(new Font(font, bold ? Font.BOLD : Font.PLAIN, fontSize));


    label.setAlignmentX(alignment);
    if(verticleAlignment.length > 0){
        label.setAlignmentY(verticleAlignment[0]);
    }
    return label;
}

なんらかの理由で、varArg verticleAlignment に何を入力しても、実際には適用されないのですか?

add(createLabel("ChatBytes™ - Do not steal.", "Arial", false, 12, CENTER_ALIGNMENT, BOTTOM_ALIGNMENT));

関数の setYAlignment 部分を無視する理由を誰でも見ることができますか?

これは、それがどのようにレンダリングされるかです

4

2 に答える 2

5

別の方法として、ネストされたレイアウトを検討してください。以下の例では、関連するラベルが のSOUTH領域に追加されBorderLayout、 のデフォルトでJFrameあり、ログイン パネルのプレースホルダーが に追加されCENTERます。各アプローチのサイズ変更動作が適切かどうかを調べます。

補遺:が無視されている理由を[学びたい] 。 setAlignmentY()

BoxLayout の使用方法: ボックス レイアウト機能で説明されているように、「 がBoxLayoutコンポーネントを上から下にレイアウトすると、… コンテナの下部に余分なスペースが表示されます。」これは、元の観察と正しい解決策を説明しています。

setAlignmentX()API では、「垂直方向の配置を設定する」およびsetAlignmentY()「水平方向の配置を設定する」ことに注意してください。このコンテキストでは、垂直は のような上から下へのレイアウトの垂直軸を意味しBoxLayout.Y_AXIS水平は のような左から右へのレイアウトの水平軸を意味しBoxLayout.X_AXISます。BoxLayout の使用方法: 配置の問題の修正では、この 2 つをBoxAlignmentDemo対比しています。下図の左から右へのレイアウトでsetAlignmentY()は、水平レイアウト軸に対する垂直位置を調整するために使用されます。あなたのような上から下へのレイアウトでsetAlignmentY()は、まったく効果がありません。

setAlignmentY


画像

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

/** @see https://stackoverflow.com/a/18805146/230513 */
public class Test {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(createLogin(), BorderLayout.CENTER);
        JLabel admonition = new JLabel("ChatBytes™—Do not steal.", JLabel.CENTER);
        f.add(admonition, BorderLayout.SOUTH);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private static JPanel createLogin() {
        JPanel p = new JPanel();
        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
        JLabel label = new JLabel("Existing CHATBYTES login panel.");
        label.setFont(label.getFont().deriveFont(Font.ITALIC, 24f));
        label.setAlignmentX(0.5f);
        label.setBorder(new EmptyBorder(0, 20, 0, 20));
        p.add(Box.createVerticalStrut(36));
        p.add(label);
        p.add(Box.createVerticalStrut(144));
        return p;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}
于 2013-09-14T18:39:07.910 に答える
3

使用する

    add(Box.createVerticalGlue());

コンポーネントを JFrame の下部に押し込む垂直スペースを作成する

于 2013-09-14T16:19:56.470 に答える