2016-11-10 8 views
0

私はJLabelを中心にしたい一連の列を持つJDialogを持っています。私はそれを行う方法について何かを見つけることができないようです。私はそれをセルの中に集中させることができます。このイメージ "Target"と "Change"のラベルは、中央に置く必要があります。 Time Line SettingsGridBagLayoutでスパンされた列を中心にする

ここにこのJDialogを生成するSSCCEがあります。

package stokerMonitor; 

import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.Dialog.ModalityType; 

import javax.swing.JDialog; 
import javax.swing.JLabel; 
import javax.swing.JSeparator; 
import javax.swing.SwingConstants; 


public class test { 

static JDialog timeLineDialog; 
static int row=0; 

public static void main(String[] args) { 
    timeLineDialog = new JDialog(); 
    timeLineDialog.setLayout(new GridBagLayout()); 
    timeLineDialog.setModalityType(ModalityType.MODELESS); 
    timeLineDialog.setTitle("Time Line Settings"); 
    timeLineDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
    JLabel timeLabel = new JLabel("Time"); 
    JLabel actionLabel = new JLabel("Action"); 
    JLabel probeTempLabel=null; 
    JLabel pitTempLabel=null; 
    JLabel targetHeader=new JLabel("Target"); 
    Font boldFont=targetHeader.getFont().deriveFont(Font.BOLD, (float) 14); 
    targetHeader.setFont(boldFont); 
    JLabel changeHeader=new JLabel("Change"); 
    changeHeader.setFont(boldFont); 
    if (Configuration.getInstance().celsius) { 
     probeTempLabel = new JLabel("Temp (\u00B0 C)"); 
     pitTempLabel = new JLabel("Temp (\u00B0 C)"); 
    } 
    else { 
     probeTempLabel = new JLabel("Temp (\u00B0 F)"); 
     pitTempLabel = new JLabel("Temp (\u00B0 F)"); 
    } 
    JLabel meatLabel=new JLabel("Meat"); 
    JLabel cookTimeLabel=new JLabel("Est. Time"); 
    JLabel weightLabel=new JLabel("Weight"); 
    JLabel probeLabel=new JLabel("Probe"); 
    JLabel pitLabel=new JLabel("Pit"); 
    setNewSeparator(1,row); 
    GridBagConstraints gbc=makeGbc(2, row); 
    gbc.gridwidth=7; 
    gbc.fill=GridBagConstraints.HORIZONTAL; 
    gbc.anchor=GridBagConstraints.CENTER; 
    timeLineDialog.add(targetHeader,gbc); 
    setNewSeparator(9,row); 
    timeLineDialog.add(changeHeader,makeGbc(10, row)); 
    setNewSeparator(12,row++); 
    setNewSeparator(1,row); 
    timeLineDialog.add(timeLabel, makeGbc(2, row)); 
    timeLineDialog.add(probeTempLabel,makeGbc(3, row)); 
    timeLineDialog.add(meatLabel,makeGbc(4, row)); 
    timeLineDialog.add(weightLabel,makeGbc(5, row)); 
    timeLineDialog.add(cookTimeLabel,makeGbc(6, row)); 
    timeLineDialog.add(probeLabel,makeGbc(7, row)); 
    timeLineDialog.add(actionLabel, makeGbc(8, row)); 
    setNewSeparator(9,row); 
    timeLineDialog.add(pitLabel,makeGbc(10, row)); 
    timeLineDialog.add(pitTempLabel, makeGbc(11, row++)); 
    setNewSeparator(12,row); 
    timeLineDialog.pack(); 
    timeLineDialog.setLocationRelativeTo(GUI.getInstance().getFrame()); 
    timeLineDialog.setVisible(true); 
} 

static void setNewSeparator(int column_,int row_) { 
    JSeparator sep=new JSeparator(SwingConstants.VERTICAL); 
    sep.setPreferredSize(new Dimension(1,1)); 
    GridBagConstraints gbc=makeGbc(column_, row_); 
    gbc.fill=GridBagConstraints.VERTICAL; 
    gbc.weighty=1.; 
    timeLineDialog.add(sep,gbc); 
} 

static GridBagConstraints makeGbc(int x, int y) { 
     GridBagConstraints gbc = new GridBagConstraints(); 
     Insets WEST_INSETS=new Insets(5,0,5,5); 
     Insets EAST_INSETS=new Insets(5,5,5,0); 
     gbc.gridx = x; 
     gbc.gridy = y; 
     gbc.gridwidth = 1; 
     gbc.gridheight = 1; 

     gbc.anchor = (x == 0) ? GridBagConstraints.WEST : GridBagConstraints.EAST; 
     gbc.fill = (x == 0) ? GridBagConstraints.BOTH 
      : GridBagConstraints.HORIZONTAL; 

     gbc.insets = (x == 0) ? WEST_INSETS : EAST_INSETS; 
     gbc.weightx = (x == 0) ? 0.1 : 1.0; 
     gbc.weighty = 1.0; 
     return gbc; 
    } 
} 

これらのヘッダーを中央に配置するために必要なことを誰かが説明することはできますか? TIA。

+0

は、複数の列にまたがるように1より【gridwidth(http://docs.oracle.com/javase/8/docs/api/java/awt/GridBagConstraints.html#gridwidth)が大きくを使用します。 – VGR

+1

@VGR彼はすでに 'targetHeader'に対して' gridwidth = 7'を持っています。 (私は他のものを見なかった) – dsh

答えて

3

ヒントを意味:レイアウトをデバッグするとき、私はそれが有用異なる背景色を持つように各コンポーネントを設定するために見つけます。次に、その特定のコンポーネントに割り当てられた領域が表示されます。ほとんどのコンポーネントはデフォルトで透明な背景になっているため、境界が表示されません。 (例:)

レイアウトには、指定した7つの列がJLabelで塗りつぶされていることがあります。しかし、ラベル自体は、そのラベルが埋め込むスペースの最も左の部分にそのラベルを含むテキストを描画します。あなたがないにレイアウトを伝えることができ、また targetHeader.setHorizontalAlignment(JLabel.CENTER);

    1. あなたはそれがラベル内のテキストを中央揃えにしたいというラベルを教える:

      は、二つの別の解決策がありますスペースを埋める。 gbc.fill=GridBagConstraints.NONE;

  • +0

    ありがとう。私はgbc.fill = GridBagConstraints.NONEを使用しました。そしてそのトリックをしました。私はその名前が意味するものの反対であるように見えるので、これらの値を再読み込みする必要があります。 –

    +0

    GBCの塗りつぶし定数は、彼らの言うことを正確に行います。視覚的に見るには、ラベルの背景と不透明度を設定します。 'fill = NONE'の場合、ラベルはセルを埋めることはありません。 'fill = HORIZONTAL'で、ラベルはそれを埋めます。ラベルはラベルのある領域の左端から始まるテキストを描画します(そうでない場合、ラベル自身の水平方向の配置を設定しない限り)。 GBCのアンカーは、コンポーネントがいっぱいになっていない場合にのみ意味を持ちます。コンポーネントがスペースを埋めると、コンポーネントの開始位置は問題にならないからです。キーは、さまざまなプロパティと値の相互作用です。 – dsh

    +0

    *ヒント:レイアウトをデバッグするときは、各コンポーネントの背景色が異なるように設定すると便利です。*残りの回答は読んでいますが、コメントを有効にする。Nice one :)多くのレイアウトの問題は、コンポーネントがサイズでない場合にサイズに引き伸ばされるか、レイアウトの制約により、多かれ少なかれ列や行が割り当てられていると想定されるため、OPに送られます。 BGの色を設定することは、コードで使用されるレイアウトの仮定の一種の「酸テスト」と考えられるべきです。 –

    1

    VGRがコメントで述べたように、GridBagLayoutが2つのトップラベルを扱う方法を理解しやすくするために、制約内にグリッド幅を設定する必要があります。

    対象ラベルのグリッド幅を7に設定し、変更ラベルのグリッド幅を2に設定します。以下のすべてのラベルは1に設定する必要があります。

    GridBagConstraints.anchor = GridBagConstants.CENTERを設定すると、探している動作が実行されます。

    編集:私は、ターゲットラベルを5に言ったが、私は7

    関連する問題