• ベストアンサー

GridBagLayoutについての質問

ウィンドウ上のjContentPane上にJPanelを配置し、レイアウトをGridBagLayoutにしてそのJPanel上にJTextFieldを置くとそのJTextFieldの幅がほぼ0になります。下記のプログラムがその一部です。gridBagConstraints2.fill をnullにしたままJTextFieldの幅を広げたいのですがどうしたらいいでしょうか?教えてください。 private JPanel getJPanel() { if (jPanel == null) { GridBagConstraints gridBagConstraints2 = new GridBagConstraints(); jPanel = new JPanel(); jPanel.setLayout(new GridBagLayout()); jPanel.setPreferredSize(new java.awt.Dimension(200,150)); gridBagConstraints2.gridx = 0; gridBagConstraints2.gridy = 0; gridBagConstraints2.weightx = 1.0; gridBagConstraints2.fill = java.awt.GridBagConstraints.NONE; gridBagConstraints2.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints2.gridwidth = 4; jPanel.add(getJTextField(), gridBagConstraints2); } return jPanel; } private JTextField getJTextField() { if (jTextField == null) { jTextField = new JTextField(); jTextField.setColumns(32); } return jTextField; }

質問者が選んだベストアンサー

  • ベストアンサー
  • T0ngT0ng
  • ベストアンサー率40% (8/20)
回答No.5

#2です。 えーと、setMinimizeSizeでうまくいきませんでした? (fillはNONEでもnullでも動きは同じだと思います。) いちおう、setPreferredSizeでだめな理由もしらべてみました。 JTextFieldにseColumns(32)してますよね? これをやると、setPreferredSizeで指定した値よりも、 getPreferredSizeはカラム数のほうを優先して幅を返すようになります。 で、32文字とすると、推奨幅は親コンポーネントの幅200を越えてしまい ますので、レイアウト時に無視されてしまうようです。 最小サイズを指定するのに抵抗があるようでしたら、 JTextFieldでgetPreferredSizeをオーバライドして、固定値を 返すようにしても良いかもしれません。

その他の回答 (4)

  • omni2
  • ベストアンサー率53% (33/62)
回答No.4

#No.1です。何度もすみません。 あれ??変わらないですか??おかしいですね?私の環境では動いてるんですが・・ いちおう、サンプルプログラム置いておきます。意味ないかもしれませんが。 これ以上書きこむと混乱させるだけなので止めておきます。上級者の方あとお願いします。すみませんでした。 ●アプレット import java.awt.*; import javax.swing.*; public class test1 extends JApplet { public void init() { GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); getContentPane().setLayout(gridbag); JTextField text = new JTextField(); c.fill = GridBagConstraints.NONE; c.weightx = 1.0; text.setPreferredSize(new Dimension(60,20)); gridbag.setConstraints(text,c); getContentPane().add(text); } } ●アプレットじゃない方 import java.awt.*; import javax.swing.*; public class test2 { public static void main(String args[]) { JFrame win = new JFrame(); win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); win.setBounds(10,10,400,300); GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); win.getContentPane().setLayout(gridbag); JTextField text = new JTextField(); c.fill = GridBagConstraints.NONE; c.weightx = 1.0; text.setPreferredSize(new Dimension(60,20)); gridbag.setConstraints(text,c); win.getContentPane().add(text); win.show(); } }

  • omni2
  • ベストアンサー率53% (33/62)
回答No.3

#No1です。トンチンカンナ回答をしてすみませんでした。 勉強しなおして! setPreferredSize(); これでいけるとおもいます。 JTextField text = new JTextField(); c.fill = GridBagConstraints.NONE; c.weightx = 1.0; text.setPreferredSize(new Dimension(30,20)); たぶん動くとおもいます。できなかったら再びすみません。勉強不足ですみません!

参考URL:
http://www.tu-chemnitz.de/global-text/doc/java/tutorial/uiswing/layout/gridbag.html
ab5
質問者

補足

どうも、ありがとうございます。text.setPreferredSize(new Dimension(30,20)); をつけても、なにも変わらないですね。

  • T0ngT0ng
  • ベストアンサー率40% (8/20)
回答No.2

あまり良い方法ではありませんが、 > gridBagConstraints2.fill をnullにしたまま ということなら、jTextFieldにsetMinimumSizeで最小サイズを設定してしまうというのはどうでしょう? (setPreferredSizeでは効かないと思うので・・・) Dimension dm = jTextField.getMinimumSize(); jTextField.setMinimumSize( new Dimension(100,dm.height ) );

ab5
質問者

補足

質問文に間違えがあったので、訂正します。 > gridBagConstraints2.fill をnullにしたまま gridBagConstraints2.fill をNONEにしたままの間違えです。

  • omni2
  • ベストアンサー率53% (33/62)
回答No.1

私も同様のことでなやんでいましたが、 gridBagConstraints2.fill = java.awt.GridBagConstraints.NONE; これを、gridBagConstraints2.fill = java.awt.GridBagConstraints.BOTH; または、gridBagConstraints2.fill = java.awt.GridBagConstraints.HORIZONTAL; で解決できないでしょうか? わたしは、JAVA初心者なので、参考にならないかもしれませんが・・

関連するQ&A

専門家に質問してみよう