JComboBoxの横幅が変更できない?!

このQ&Aのポイント
  • JComboBoxの横幅を変更する方法がわからない。
  • JComboBoxの横幅が画像表示枠を狭くしてしまう。
  • JComboBoxの設定を変更しても横幅が変わらない。
回答を見る
  • ベストアンサー

JComboBoxの横幅が変更出来ません

こんにちは、jdk1.4でswingアプリケーションを作っています。 JPanal2つをBorderLayoutで配置し、WEST側JPanelにJComboBoxその他のコンポーネントを入れて、CENTER側では、コンポーネントは置かずにJPanelに絵を描いています。 全体のサイズを600×400としている時、JComboBoxが400近い横幅をとるので、右の画像表示スペースがかなり狭くなってしまいました。 そこで、それぞれのJPanelをJScrollPaneに埋め込むことにして、なんとか、右の画像表示枠を大きくすることには成功したのですが、JComboBoxのために、いつも左パネルが横スクロール状態になるのが不満です。 JComboBoxに登録している文字列は最大でも半角25文字で、JComboBox内での 半分しか占めていないのに、なぜこんなに大きな幅になるのでしょう? JComboBoxに対して以下の設定も試してみましたが、大きさは変化しませんでした。 setPreferredSize(new Dimension(200,20)); setMaximumSize(new Dimension(200,20)); JComboBox横幅の変更方法に妙案が有れば教えて頂けませんでしょうか。

  • Java
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.2

 こんにちは、#1です。 >実はメモ書き用にJTextAreaも同じパネルに入っていて、 >実行開始時に文字列が入っていたのですけど、これを改行して >短くしたら、他のコンポーネントサイズも狭くなりました。  原因がわかって何よりです。  JTextAreaはJScrollPaneとセットで使ったほうがよいです。  JTextArea単独で使うことってめったにないと思います。 >しかし、swingってここまで柔軟に実行中のデータ変更で >コンポーネントサイズが変わるとは思いませんでした。  たしかにLayoutManagerは便利なんだか不便なんだかわからないところがありますね。  コンポーネントの推奨サイズが変わるたびにサイドのパネルの幅が大きくなったり、小さくなったりしてうざったい場合は、対策をされているようにパネルをJScrollPaneにいれて、さらにメインのパネルとサイドのパネルをJSplitPaneで分けたほうが、よりかっこいいのではないでしょうか。  こうすれば、ユーザーが自由にサイドパネルの幅を変えられますしね。  さらにJSplitPaneの連続再描画を有効にしておき、ツールバーにサイドパネルボタンみたいなのを作って、それが押されたら、javax.swing.TimerでJSplitPaneのディバイダの位置を広げていけば、まるでサイドパネルが「にゅー」とアニメーションして出てきたみたいに見えて、すごく凝った事している気分になれそうです。  もっとも、ユーザーからは「いらん事せずに、パッと出せ」と言われそうですが・・・。 >追加質問になりますが、コンポーネントサイズの調整に際して、 >Look & Feel変更の留意点などありましたら教えて頂けませんか。  Look & Feelとバージョンについて聞いたのは、今現在私がちょっと困ってまして、jdk1.5からどうやらバグがあるようで、Windows風Look&FeelのJComboBoxの推奨サイズが、小さめになってしまっていて、登録しているItemが全部表示してくれないのです。  1.5.0_02でもまだ、なおっていません。  03で直ってくれてるといいのですが。  まあ、そういうわけで、1.4でも、そういうバグがあるのかも、思ったしだいです。  Look & Feel変更の留意点といえば、ひとえに「ちゃんとLayoutManagerを使いましょう」ということではないでしょうか。  LayoutManagerにnullを指定して、コンポーネントの位置とサイズを手動で指定することもできますが、これだと、Look & Feelを変えたときにレイアウトが崩れてしまいますから、使い勝手が悪くてめんどくさくても、ちゃんとLayoutManagerを使ったほうがよいようです。  どうしても既存のLayoutManagerでは、痒いところに手が届かないという場合は、LayoutManagerを自作してもいいかもしれませんね。  では、がんばってください。

hrm_mmm
質問者

お礼

さらなる、質問にご回答頂き有り難うございます。 > JTextAreaはJScrollPaneとセットで使ったほうがよいです。 > JTextArea単独で使うことってめったにないと思います。 これまでawtでいくつかプログラムしていて、今回swingを始めて使ったので、TextAreaの場合とほとんど同じにパネルに載っけてしまいました。 以後気を付けます。 >さらにメインのパネルとサイドのパネルをJSplitPaneで分けたほうが、よりかっこいいのではないでしょうか。 > こうすれば、ユーザーが自由にサイドパネルの幅を変えられますしね。 そんなことも出来るのですね。使ってみます。 > Look & Feel変更の留意点といえば、ひとえに「ちゃんとLayoutManagerを使いましょう」ということではないでしょうか。 有り難うございます。まだ、LayoutManager自作には遠いですけど、さらにいろいろなLayoutManagerを試してみようと思います。

その他の回答 (1)

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんばんは。  いくつか補足をお願いします。  WESTのパネルのLayoutManagerはなんですか?  Swing の Look & Feel は、なんですか?ディフォルトでしょうか?  また、jdk1.4とありますが、細かいバージョンはわかりますか?

hrm_mmm
質問者

補足

素早いお返事有り難うございます。 まだ情報が足りなかったですね、済みません。1週間いろいろ試したのだけど いろいろやりすぎて、どれが必要な情報か解らなくなってきておりました。 >WESTのパネルのLayoutManagerはなんですか? 最初 GridBagLayoutを使用したのですが、幅調整がうまくいかなくて BoxLayout.Y_AXISのパネル内にGridLayout(3, 2) を組み合わせました。 しかし、やはり幅広の横スクロール状態は同じでした。 他にも多重パネルで、いろいろコンポーネントが入っているので、さっきJComboBoxを除いて実行してみたら、やっぱり、同じ幅の横スクロールになってしまいました。 せっせと入れ込むことばかり考えていたので、取り除いて試す方は、ご回答を読んでから気づきました。 JComboBoxが悪さをしていたわけではないようです。早とちりの質問をして済みません。 でもJLabelとかJButtonとかも、表示文字列よりかなり幅が大きいので、狭まるはずだと思っての質問でした。 で、さらに、実はメモ書き用にJTextAreaも同じパネルに入っていて、実行開始時に文字列が入っていたのですけど、これを改行して短くしたら、他のコンポーネントサイズも狭くなりました。 JTextAreaがdefaultでは自動改行でないことを認識しておりませんでした。 しかし、swingってここまで柔軟に実行中のデータ変更でコンポーネントサイズが変わるとは思いませんでした。 > Swing の Look & Feel は、なんですか?ディフォルトでしょうか? デフォルトです。ここの変更がどう違うのかは、まだよく解っていないので。 追加質問になりますが、コンポーネントサイズの調整に際して、Look & Feel変更の留意点などありましたら教えて頂けませんか。 > また、jdk1.4とありますが、細かいバージョンはわかりますか? Version 1.4.1 でした。 解決のきっかけを頂きどうも有り難うございました。

関連するQ&A

  • javaで2パネルにテーブルデーターを表示

    今日は! javaの初心者で、初心者なりに、フレームに2個のパネルを作成し、各パネルに同じ テーブルデーターを表示するコードを作ってみましたが、旨く行きません。 下記の添付コードで、不具合点の改造箇所をお教え頂けますと大変助かります。 //================================== package packageA; import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; public class JTableTest2 extends JFrame{ public static void main(String[] args){ JTableTest2 test = new JTableTest2("JTableTest2"); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } JTableTest2(String name){ setBounds( 0, 0, 300*2, 140*2); setTitle(name); String data[][] = { //テーブルデータを作る {"田辺太郎","89","79","100","100"}, {"山田大助","68","55","72","100"}, {"佐藤恵美","78","69","81","100"} }; //列名の配列 String title[] = {"名前","数学","英語","国語","音楽"}; JTable table = new JTable(data,title); //テーブルデータと列名でテーブルを作る JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); JScrollPane sp = new JScrollPane(table); sp.setPreferredSize(new Dimension(250, 80)); p1.add(sp); //JPanelにJScrollPaneを結合する p2.add(sp); //JPanelにJScrollPaneを結合する getContentPane().add(p1, BorderLayout.WEST); getContentPane().add(p2, BorderLayout.EAST); } } 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • javaのpanelが表示されません

    下記のプログラムを作ったんですが、eclipseで実行するとフレームは表示されますが、空のフレームのような状態で、panelやボタンなどは表示されません。mainとは別のクラスで作成してるからなんでしょうか?よろしくお願いします。 import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Table0 { public static void main(String[] args) { new Frame0(); } } class Frame0{ JFrame frame; JPanel panel; JScrollPane jsp; JTable table; DefaultTableModel dtm; public Frame0(){ frame=new JFrame("table"); frame.setBounds(30, 30, 300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); table=new JTable(8,5); jsp=new JScrollPane(table); jsp.setPreferredSize(new Dimension(250, 70)); panel=new JPanel(); panel.add(jsp); Container c=frame.getContentPane(); c.add(panel,BorderLayout.CENTER); } }

    • ベストアンサー
    • Java
  • javaのフレームにサイズがセットされてない?

    前回、http://okwave.jp/qa/q8069621.htmlで質問しました。 回答をもとにframe.setvisible(true)をコンストラクタの最後にするとうまくいき回答を締め切ったんですが・・・。 しかし、mainメソッドにframe.setvisible(true)を書くとフレームのタイトル部分だけとなり、 サイズがセットされないまま実行したときと同じようになってしまいます。 なぜでしょう?よろしくお願いします。 import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class Table0{ public static void main(String[] args) { Frame0 test=new Frame0(); test.setVisible(true); } } class Frame0 extends JFrame{ JFrame frame; JPanel panel; JScrollPane jsp; JTable table; DefaultTableModel dtm; public Frame0(){ frame=new JFrame("table"); frame.setBounds(30, 30, 300, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); table=new JTable(8,5); jsp=new JScrollPane(table); jsp.setPreferredSize(new Dimension(250, 70)); panel=new JPanel(); panel.add(jsp); Container c=frame.getContentPane(); c.add(panel,BorderLayout.CENTER); } }

    • ベストアンサー
    • Java
  • JavaのSwingのレイアウト

    Swingを学習中ですが、うまくレイアウトできません。 添付した画像のようなレイアウトにしたいです。 作ってみたものは以下です。 import java.awt.BorderLayout; import java.awt.Color; import javax.swing.*; public class LayoutTest { public static void main(String[] args) { JFrame frame = new JFrame(); JPanel panel = new JPanel(); JTextField searchFiled = new JTextField("テキスト"); String[] comboboxString = {"C", "C++", "Java"}; JComboBox comboBox = new JComboBox(comboboxString); JButton button = new JButton("ボタン"); panel.add(comboBox, BorderLayout.EAST); panel.add(searchFiled, BorderLayout.CENTER); panel.add(button, BorderLayout.WEST); frame.add(panel, BorderLayout.PAGE_START); JPanel redPanel = new JPanel(); redPanel.setBackground(Color.RED); frame.add(redPanel); frame.setSize(700, 500); frame.setLocationRelativeTo(null); frame.setVisible(true); } }

    • ベストアンサー
    • Java
  • JScrollPaneのオブジェクトは位置位置

    JScrollPaneについて、質問させて頂きます。 JScrollPaneに、JTextAreaを縦一列に配置したJPanelを追加しようとしたのですが、何故かJScrollPaneに配置すると、JPanel内のJTextAreaの配置が横一列になってしまいます。 つまり、現在は TEST1 TEST2 TEST3 TEST4....(JTextAreaを並べたJPanelです) となっているJScrollPaneを Test1 Test2 Test3 Test4 のように表示したいのです。 大学の授業に絡むコードですので全てを貼付けるとネットから拾ってきたのではと思われてしまうため、全ては貼付けられませんがコードの一部を張りつけさせて頂きます。 まずはJScrollPaneの設定ですが private JScrollPane getScroll() { if (scroll == null) { scroll = new JScrollPane(innerHomeTimeLine); scroll.setPreferredSize(new Dimension(width, height)); scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); scroll.setWheelScrollingEnabled(true); } return scroll; } としてJScrollPaneを作成しています、innerHomeTimeLineはJTextAreaを縦一列に並べたJPanelです。 このJScrollPaneを this.add(getScroll(),BorderLayout.NORTH); でJPanelに追加し、そのJPanel(homeTimeLine)をthis.add(homeTimeLine,BorderLayout.CENTER); でJAppletに追加し、表示しています。 JPanel(innerHomeTimeLine)そのものをJAppletに追加すると縦一列に並んだまま表示出来るのは確認しているので、JScrollPaneの設定の問題だと思うのですが、どうすれば良いのでしょうか.... やり方をご存知の方がいましたら、解答して頂けると助かります、宜しくお願いします。 さすがにこのコードだけでは解答は無理、といったことでしたら、必要な部分を教えて頂ければ、抜き出して追記させて頂きます。

    • ベストアンサー
    • Java
  • javaのBoxlayoutについて

    下記はBoxLayout用ののコードです。 Q1)Buttonのサイズを設定する方法がありますか? Q2)Buttonの配置を設定する方法がありますか? //===================================== import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.LayoutManager; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class AlignmentX extends JFrame{ JButton button1; JButton button2; JButton button3; public static void main(String[] args){ AlignmentX frame = new AlignmentX(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("タイトル"); frame.setVisible(true); } AlignmentX(){ button1 = new JButton("AAAAA"); button1.setAlignmentY(0.5f); button1.setPreferredSize(new Dimension(80,20)); button2 = new JButton("BBB"); button2.setAlignmentY(0.5f); button2.setPreferredSize(new Dimension(80,20)); button3 = new JButton("CC"); button3.setAlignmentY(0.5f); button3.setPreferredSize(new Dimension(80,20)); JPanel p = new JPanel(); p.setLayout((LayoutManager) new BoxLayout(p, BoxLayout.Y_AXIS)); p.add(button1); p.add(button2); p.add(button3); getContentPane().add(p, BorderLayout.CENTER); setBounds(10, 10, 300, 200); } } //以上,宜しくお願いします。

    • ベストアンサー
    • Java
  • javaのcomboBoxでデーターの右寄表示

    javaのcomboBoxで表示データーの右寄せ表示について質問します。 Q1)下記のコードでどの様に変更すれば良いでしょうか? ====================== import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel; public class comboBox_Right extends JFrame { public static JComboBox[] combo=new JComboBox[4]; static comboBox_Right frame; public static void main(String args[]){ frame=new comboBox_Right("AAAA"); frame.setVisible(true); } comboBox_Right(String title) { setTitle(title); setBounds(100, 100, 300, 420); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); //======================================== //ComboBox data String[][] combodata = { {"A0", "B0", "C0", "D0"}, //No.1 Combo {"A1", "B1", "C1", "D1"}, //No.1 Combo {"A2", "B2", "C2", "D2"}, //No.1 Combo {"A3", "B3", "C3", "D3"}, //No.1 Combo }; for(int i=0; i<4; i++){ combo[i] = new JComboBox(combodata[i]); //make 4 comboBox combo[i].setPreferredSize(new Dimension(175, 25)); //ComboBox Size } //=============== for(int i=0; i<4; i++) p.add(combo[i]); //add 4 comboBox //=============== Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); } } =============================== 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • JTextFieldの大きさ

    すべて記述すると長くなるので、必要なところを抜粋したコードです。 JPanel jpnl1 = new JPanel(new GridLayout(1, 2)); JLabel jlbl = new JLabel("文字列"); JTextField jtf = new JTextField(); Container cont = getContentPane(); jpnl1.setPreferredSize(new Dimension(20, 15)); jpnl1.add(jlbl); jpnl2.add(jtf); cont.add(jpnl1, BorderLayout.CENTER); これで実行(別クラスから呼び出し)すると、JTextFieldの大きさが不必要に大きくなってしまいます(6行目の設定が効かない)。 JTextFieldを自分の思ったようなサイズにすることはできないのでしょうか? 親クラス・・・JFrame 別クラスからは、setBounds(100, 100, 300, 130)として呼び出しています(setVisible(ture)) 環境・・・WindowXP、JDK1.5.09 JRE1.5.09

    • ベストアンサー
    • Java
  • 初心者ですがコンストラクターについて質問

    swingを現在勉強中なのですが、とりあえずコンポーネントを作成する部分で、以下のようなソースを書きました。 JPanel p1 = new JPanel(); p1.setPreferredSize(new Dimension(100, 100)); Border border = new BevelBorder(BevelBorder.RAISED); p1.setBorder(border); 4行目ですが、コンストラクターを呼び出してインスタンス化する場合にBorderオブジェクト型になっているのですが、素人の私には BevelBorder bevelborder = new BevelBorder(BevelBorder.RAISED); にならないのはなぜ?と思ってしまいます。APIをみればsetBorderメソッドがBorderオブジェクトを引数にもつ事は理解できますが、コンストラクターの部分はいまいち理解できません。初歩的な質問ですが、教えていただけないでしょうか?

    • ベストアンサー
    • Java
  • JButtonの改行したラベルがリロードで消える

    JavaAppletでJbuttonに表示する文字列の改行を実現した サンプルページを参考にボタンを作成し、IE上で表示させたのですが 初期表示は問題なく動作するものの、表示したページを 再読込(リロード)すると、文字が消えてしまいます。 (再読込後の画面コピーを添付します) リロード時にもボタンに表示された文字を表示させるためには ブラウザの設定変更やコードの修正が必要なのでしょうか? 以下は、実行環境及びコードです。 環境 OS:WindowsXP ブラウザ:IE7 JRE:1.6.0_26 ※クラスファイル、HTMLファイルともにCドライブ直下に配置し実行。 ソース ○test.java import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JPanel; public class test extends JApplet { private static final long serialVersionUID = 1L; JButton button; public void init() { setBackground(Color.WHITE); setLayout(new BorderLayout()); button = new JButton("<html>改行<br />ボタン</html>"); button.setPreferredSize(new Dimension(120,80)); JPanel panel = new JPanel(); panel.setBackground(Color.WHITE); panel.add(button); add(panel, BorderLayout.CENTER); } } ○test.html <html> <head></head> <body> <applet code="test.class" WIDTH=120 HEIGHT=100> </applet> </body> </html>

    • ベストアンサー
    • Java

専門家に質問してみよう