2017-06-25 13 views
0

GridBagLayoutを使用して、image、JLabel、およびJTextFieldを表示したいとします。JavaのGridBagLayout

画像は、これは私がしようとしたものです。この

enter image description here

のように見えたはずですが、JTextFieldの画像の下の表示ではなく、ほかに

JPanel panel = new JPanel(new GridBagLayout()); 
    gbc = new GridBagConstraints(); 

    for (int i = 0; i < ELEMENTS; i++) { 
     Image image = ImageIO.read(file[i]); 
     Image imageScaled = image.getScaledInstance(80, 95, Image.SCALE_SMOOTH); 
     ImageIcon imageIcon = new ImageIcon(imageScaled); 
     foodLabel[i] = new JLabel(imageIcon); 
     qtyField[i] = new JTextField(3); 
    } 

    gbc.gridx = 0; 
    for (int i = 0; i < ELEMENTS; i++) { 
     if (i % 3 == 0) { 
      gbc.gridy += 2; 
      gbc.gridx = 0; 
     } 
     panel.add(foodLabel[i], gbc); 
     gbc.gridy++; 
     panel.add(qtyField[i], gbc); 
     gbc.gridx++; 
     gbc.gridy--; 
     tabbedPane.addTab(text, panel); 
    } 
+0

JTextFieldの画像は何ですか?青い箱? –

+0

@FlorianS。はい。 – Tony

答えて

1

問題は、あなたが追加しているということですgridyの値を差し引いてください。 foodLabelの右側にコードをqtyFieldに調整するには、gbc.gridyを削除し、panel.add(foodLabel[i], gbc)の後にgbc.gridx ++を追加するだけです。

今、それはあなたが正しく設定しないと(少なくとも私がそれをしないと思っています。 JLabelfoodImage)の新しい配列を作成することができます。foodLabelと同じサイズで、画像のみを表示することができます。あなたのコードはほぼ正しいでしょう、いくつかの行を移動し、foodImageを追加します。私が書いたとここにある:

JPanel panel = new JPanel(new GridBagLayout()); 
gbc = new GridBagConstraints(); 
// Just to give a space between the components 
gbc.insets = new Insets(5, 5, 5, 5); 

for (int i = 0; i < ELEMENTS; i++) { 
    Image image = ImageIO.read(file[i]); 
    Image imageScaled = image.getScaledInstance(80, 95, Image.SCALE_SMOOTH); 
    ImageIcon imageIcon = new ImageIcon(imageScaled); 
    foodImage[i] = new JLabel(imageIcon); 
    foodLabel[i] = new JLabel("Label"); 
    qtyField[i] = new JTextField(3); 
} 

gbc.gridx = 0; 
for (int i = 0; i < ELEMENTS; i++) { 
    if (i % 3 == 0) { 
     gbc.gridy += 2; 
     gbc.gridx = 0; 
    } 

    // Add the image 
    panel.add(foodImage[i], gbc); 
    // Below the image 
    gbc.gridy++; 
    // Add the label 
    panel.add(foodLabel[i], gbc); 
    // Go back up 
    gbc.gridy--; 
    // Next column 
    gbc.gridx++; 
    // Add the textfield 
    panel.add(qtyField[i], gbc); 
    // Next column 
    gbc.gridx++; 
    tabbedPane.addTab(text, panel); 
} 

I ran this code, and should be like this

+0

JTextFieldの幅を広げる方法は? – Tony

+0

新しいDimensionインスタンスを作成し、 'jTextField.setPreferredSize(/ * dimension instance * /)'で使用する必要があります。必要に応じて 'setSize()'、 'setMaximumSize()'や 'setMinimunSize()'を使うこともできます。 [チュートリアル](https://docs.oracle.com/javase/tutorial/uiswing/components/textfield.html)および[documentation](https://docs.oracle.com/javase/8/docs)を参照してください。 /api/javax/swing/JTextField.html)を参照してください。 –

1

あなたはこの

// initialize gridy with -2 because when i == 0 you increase it by 2 in the for loop 
gbc.gridy = -2; 
gbc.gridx = 0; 

for (int i = 0; i < ELEMENTS; i++) { 
    if (i % 3 == 0) { 
     gbc.gridy += 2; 
     gbc.gridx = 0; 
    } 
    panel.add(foodLabel[i], gbc); 
    gbc.gridx++; 
    panel.add(qtyField[i], gbc); 
    gbc.gridx++; 

    // do you really whant to do this within the loop? I guess it should be outside... 
    // tabbedPane.addTab(text, panel); 
} 
tabbedPane.addTab(text, panel); 

...と1つの最後の質問のようなforループを変更する必要がありますなぜあなたは2でgridyを増やすのですか?それを1つ増やすべきではないでしょうか?

+0

は動作していません.... – Tony

関連する問題