2

JLabel を BorderLayout の中央に配置したいと考えています。今のところ、私は と を使用label.setHorizontalAlignment(SwingConstants.CENTER);してlabel.setVerticalAlignment(SwingConstants.BOTTOM);います。

ここに完全なコード:

public class JSector extends JRenderPanel implements WarpGateConstants {

private Sector sector;

private JLabel jLabelSectorName;
private JLabel[] jLabelWarpGate;

public JSector(Sector s) {
    super(new BorderLayout());
    this.setSector(s);
    setBorder(new EmptyBorder(5, 5, 5, 5));

}

@Override
public void paintView(Graphics2D g) {
    g.setColor(getBackground());
    g.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, getWidth() / 3, getHeight() / 3);
    g.setColor(getForeground());
    g.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, getWidth() / 3, getHeight() / 3);
}

private void setSector(Sector s) {
    this.sector = s;
    drawSectorInfo(s);
}

public Sector getSector() {
    return sector;
}

private void drawSectorInfo(Sector s) {
    removeAll();
    if (jLabelSectorName == null || jLabelWarpGate == null) {
        this.jLabelWarpGate = new JLabel[WARPGATE_MAX_VALUE + 1];
        this.jLabelWarpGate[WARPGATE_NORTH] = new JLabel("N");
        this.jLabelWarpGate[WARPGATE_EAST] = new JLabel("E");
        this.jLabelWarpGate[WARPGATE_SOUTH] = new JLabel("S");
        this.jLabelWarpGate[WARPGATE_WEST] = new JLabel("W");

        for (byte i = 0; i < jLabelWarpGate.length; i++) {
            setupLabel(jLabelWarpGate[i], i);
        }

        this.jLabelSectorName = new JLabel("SectorName");

        add(this.jLabelWarpGate[WARPGATE_NORTH], BorderLayout.NORTH);
        add(jLabelWarpGate[WARPGATE_EAST], BorderLayout.EAST);
        add(jLabelWarpGate[WARPGATE_SOUTH], BorderLayout.SOUTH);
        add(jLabelWarpGate[WARPGATE_WEST], BorderLayout.WEST);
        add(jLabelSectorName, BorderLayout.CENTER);

    }
    for (byte i = 0; i < jLabelWarpGate.length; i++) {
        WarpGate gate = s.getWarpGate(i);
        if (gate != null && gate.exists()) {
            jLabelWarpGate[i].setToolTipText("TargetSector: " + gate.getTargetGridPos());
            jLabelWarpGate[i].setVisible(true);
        } else {
            jLabelWarpGate[i].setVisible(false);
        }
    }
    jLabelSectorName.setText(s.getName());

}

private static JLabel setupLabel(JLabel label, byte warpGateID) {
    Font font = label.getFont();
    font = new Font(font.getName(), Font.BOLD, font.getSize() + 2);
    label.setFont(font);
    label.setForeground(new Color(255, 150, 0));
    label.setBackground(new Color(0, 100, 255, 150));
    label.setOpaque(true);

    switch (warpGateID) {
        case WARPGATE_NORTH:
            label.setHorizontalAlignment(SwingConstants.CENTER);
            label.setVerticalAlignment(SwingConstants.TOP);
            break;
        case WARPGATE_EAST:
            label.setHorizontalAlignment(SwingConstants.RIGHT);
            label.setVerticalAlignment(SwingConstants.CENTER);
            break;
        case WARPGATE_SOUTH:
            label.setHorizontalAlignment(SwingConstants.CENTER);
            label.setVerticalAlignment(SwingConstants.BOTTOM);
            break;
        case WARPGATE_WEST:
            label.setHorizontalAlignment(SwingConstants.LEFT);
            label.setVerticalAlignment(SwingConstants.CENTER);
            break;

    }
    return label;
}

}

うまく機能しますが、西門と東門の垂直位置が異なります。

西門と東門の垂直位置が異なる

この問題を解決するのを手伝ってくれることを願っています

編集:私は問題を見つけたと思います。一部のラベルを表示 (false) に設定すると、問題が発生します。しかし、問題はまだ残っています。これらの Jlabels を同じ行で取得するにはどうすればよいですか。

4

2 に答える 2

4

私に適した(1つの)解決策を見つけました:

label.setForeground(new Color(255, 255, 255, 0));

これにより、コンポーネントが「表示」されますが、何も表示されません => すべての JLabel は同じレベルにあります

于 2012-07-09T14:33:09.237 に答える
3

BorderLayout の North または South の「スロット」にコンポーネントがない場合、East および West コンポーネントが拡張されてそのスペースを埋めるため、そのコンポーネントの中心は、他のコンポーネントが表示されるかどうかに依存します。

複雑さの順にリストされた 3 つの可能な解決策が思い浮かびます。

  • 常にすべてのラベルを表示しますが、その端にゲートがない場合は内容を置き換えて非表示にします。一貫性を保つために高さを手動で設定する必要がありますが、プロトタイピングには問題ありません。
  • 別の LayoutManager を使用します (ただし、特に適したものは思い浮かびません)。
  • ネストされたコンポーネントに依存せずにゲートを表すセクターを描画し、必要な計算を手作業で行います。

私はおそらく最初のオプションに固執し、後で 3 番目のオプションに移行します。

于 2012-07-09T14:15:49.937 に答える