JFrameとJPanelの最大化について

このQ&Aのポイント
  • Swingで複数のパネルを描画するアプリで、フレームの最大化ボタンを押してもパネルが最大化されず、位置の調整もできない問題が発生しています。
  • フレームにレイアウトマネージャを指定しても、パネルは最大化されません。
  • どのパネルを表示しているときにもパネルの最大化を行いたいですが、どうすればよいでしょうか?
回答を見る
  • ベストアンサー

JFrameとJPanelの最大化について

swingでアプリケーションを作成しています。 1つのフレーム上に複数のパネルを描画する(画面遷移)アプリです。 たとえば、ログイン用のパネル、メニュー用のパネルと言ったように用意しています。 ここで問題が発生しました。 フレームの最大化ボタンを押しても、パネルが最大化されず、パネル内に配置しているボタンなども位置の調整が行われません。 フレームにレイアウトマネージャーを指定しても、パネルは最大化されないのでしょうか? フレーム自体にボタンを配置すると調整はされるのですが・・・ 今のところクラス構成としては、 フレームクラス ログインパネルクラス メニューパネルクラス データ表示パネルクラス となっています。 ログインパネルのボタンを押されたら、ログインパネルを破棄し、メニューパネルを表示するといった作りにしています。 どのパネルを表示しているときにも、フレームの最大化ボタンが押された場合にパネルの最大化も行いたいのです。 どなたかご教授願えませんでしょうか?

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

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

  • ベストアンサー
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.2

試しに、GridBagLayoutで、パネルを変更するサンプル作ってみました。 参考までにどうぞ。 ---------------------------------------------------------------------- import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class SampleApplication2 implements ActionListener {   private JFrame frame = null;   private JPanel panel1 = null;   private JPanel panel2 = null;   private GridBagLayout layoutManager1 = null;   private GridBagLayout layoutManager2 = null;   private JButton btnToScreen1 = null;   private JButton btnToScreen2 = null;      public static void main(String[] args) {     SampleApplication2 app = new SampleApplication2();   }      SampleApplication2() {     SwingUtilities.invokeLater(new Runnable() {       public void run() {         createAndShowGUI();       }     });   }      public void actionPerformed(ActionEvent event) {     if (event.getSource().equals(btnToScreen1)) {       frame.getContentPane().remove(panel2);       frame.getContentPane().add(panel1);       SwingUtilities.updateComponentTreeUI(frame);     } else if (event.getSource().equals(btnToScreen2)) {       frame.getContentPane().remove(panel1);       frame.getContentPane().add(panel2);       SwingUtilities.updateComponentTreeUI(frame);     }   }      private void addComponent(JPanel panel, GridBagLayout gbl, Component comp, int x, int y       , int w, int h) {     GridBagConstraints c = new GridBagConstraints();     c.fill = GridBagConstraints.BOTH;     c.gridx = x;     c.gridy = y;     c.gridwidth = w;     c.gridheight = h;     c.weightx = 1.00; // panel のサイズに連動して、コンポーネントの配置を自動調整。     c.weighty = 1.00; // panel のサイズに連動して、コンポーネントの配置を自動調整。     gbl.setConstraints(comp, c);     panel.add(comp);   }      private void createAndShowGUI() {     // create window.     frame = new JFrame("SampleApplication");     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);          // create panel.     panel1 = new JPanel();     panel2 = new JPanel();     frame.getContentPane().add(panel1);          // create LayoutManager.     layoutManager1 = new GridBagLayout();     panel1.setLayout(layoutManager1);     layoutManager2 = new GridBagLayout();     panel2.setLayout(layoutManager2);          // create Button     btnToScreen2 = new JButton("画面2へ");     btnToScreen2.addActionListener(this);     addComponent(panel1, layoutManager1, btnToScreen2, 0, 0, 1, 3);     addComponent(panel1, layoutManager1, new JButton("Button2"), 1, 0, 1, 1);     addComponent(panel1, layoutManager1, new JButton("Button3"), 1, 1, 1, 1);     addComponent(panel1, layoutManager1, new JButton("Button4"), 1, 2, 1, 1);          btnToScreen1 = new JButton("画面1へ");     btnToScreen1.addActionListener(this);     addComponent(panel2, layoutManager2, new JButton("Button5"), 0, 0, 3, 1);     addComponent(panel2, layoutManager2, new JButton("Button6"), 0, 1, 1, 1);     addComponent(panel2, layoutManager2, new JButton("Button7"), 1, 1, 1, 1);     addComponent(panel2, layoutManager2, btnToScreen1, 2, 1, 1, 1);          // Display the window.     frame.pack();     frame.setVisible(true);   } }

tamutamu55
質問者

お礼

早速のご解答ありがとうございます。 上記を参考にして、いろいろと試みてみます。

その他の回答 (1)

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

> どのパネルを表示しているときにも、フレームの最大化ボタンが押された場合にパネルの最大化も行いたいのです。 特別な事はしなくても、フレームを最大化したら、パネルも最大化される見たいですよ。 以下、例です。 ---------------------------------------------------------------------- import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class SampleApplication {   private JFrame frame = null;   private JPanel panel = null;   private BorderLayout layoutManager = null;      public static void main(String[] args) {     SampleApplication app = new SampleApplication();   }      SampleApplication() {     SwingUtilities.invokeLater(new Runnable() {       public void run() {         createAndShowGUI();       }     });   }      private void createAndShowGUI() {     // create window.     frame = new JFrame("SampleApplication");     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);          // create panel.     panel = new JPanel();     frame.getContentPane().add(panel);          // create LayoutManager.     layoutManager = new BorderLayout();     panel.setLayout(layoutManager);          // create Button     panel.add(new JButton("Button1"), BorderLayout.NORTH);     panel.add(new JButton("Button2"), BorderLayout.WEST);     panel.add(new JButton("Button3"), BorderLayout.CENTER);     panel.add(new JButton("Button4"), BorderLayout.EAST);     panel.add(new JButton("Button5"), BorderLayout.SOUTH);          // Display the window.     frame.pack();     frame.setVisible(true);   } } ----------------------------------------------------------------------

tamutamu55
質問者

補足

たとえば、ログインボタンを押した際には、以下のようにしてメニュー画面を表示しています。 getContentPane().remove(jPanel1); NewJPanel panel = new NewJPanel(); getContentPane().add(panel); repaint(); validate(); このときパネルにサイズを指定しないと次のパネルが表示されません。 サイズを指定して、次のパネルを表示させて後最大化ボタンを押してもパネルに設定されているボタン等の位置が調整されません。 こういった場合の対処方法はご存知でしょうか? ちなみに、フレーム・パネルともにGritBagLayoutを使用しております。

関連するQ&A

  • Java JFrameにJPanelを・・・

    こんにちは。趣味でプログラミングをしているものです。 さっそくですが、質問させていただきます。 Java で電卓を作っているのですが、 文具店で1000円くらいで販売している電卓を再現したいのですが、 いろいろなボタンの操作はなんとなくわかってきたのですが、 電卓のGUIについて質問させていただきます。 JFrame を継承したクラスに背景の画像を描画し その上に、計算の経過、結果を表示するJPanelを 継承したクラスのインスタンスを 特定の座標に配置したいのですが、 うまくいきません。 以下に自分の作ったコードを載せますので、 どこが悪いのか、教えていただけないでしょうか。 よろしくお願いします。 package test01_frame; import java.awt.*; import javax.swing.*; public class TestFrame extends JFrame { Image bgimage; JPanel jp01; TestFrame() { super(); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setSize( 384, 576 ); setLocationRelativeTo( null ); bgimage = new ImageIcon( "images/image01.jpg").getImage(); repaint(); //コメントアウトした部分がわからない箇所です。 //jp01 = new JPanel(); //jp01.setPreferredSize( new Dimension( 360, 50 )); //jp01.setBackground(Color.RED); //add( jp01 ); //jp01.setLocation( new Point( 10, 30 )); setVisible( true ); } public void update( Graphics g ) { paint( g ); } public void paint( Graphics g ) { g.drawImage( bgimage, 0, 0, null ); } /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ new TestFrame(); } }

    • ベストアンサー
    • Java
  • Jpanelにグラフを書くプログラム

    質問させて頂きます。 今、ファイルから西暦、月、日、時間、そのときの温度、湿度を読み込んでグラフ表示するプログラムを作っています。そこで、Swingを使ってPanelを三つ作成し、一番上のPanelにグラフ、二番目にデータの日付を指定するJComboBoxボタン(何年何月何日等)、三番目にグラフ描画時の現在時刻を表示するプログラムを作っています。 そこで質問なんですが、一番目のPanelにグラフを表示する方法がわからなくて困っています。 これのPanel1に簡単な図を描く方法を教えていただければ自分でも考えられると思いますので、よろしくお願いします

    • ベストアンサー
    • Java
  • swingについて

    こんにちは。 swingについて質問させていただきます。 swingで配置したボタンなどが、設定したフレームのサイズから最大化した場合に、始めに配置した位置からズレて表示されてしまいます。 フレームのサイズが変更された場合でも、コンポーネントの位置がズレないようにするにはどのようにすればいいでしょうか?

  • jpanelのタイトルの横に・・・

    どなたか知恵を貸してください。 現在、javaのswingを使って画面を作っています。画面の中のswingコンテナのパネル(jpanel)には、ボーダーを表示し、タイトルをつけています。  質問なのですが、そのタイトルのすぐ右横にjtextfieldを表示させたいのですが、どういうレイアウト手法を使ったらよいのでしょうか?仕事で作成しなければならないため、焦っています。良い知恵がありましたらアドバイスをよろしくお願いします。

  • 【Swing】JPanel クラス外からのremoveについて

    _tonnuraと申します。どうぞよろしくお願いします。 現在、 ・初期画面(Menu.java) ・イベント(ButtonClicked.java) ・パネル設定(Mondai.java) の3つを使用して、画面を切り替えようとしています。(パネルを載せていく形です) 「Class Mondai」にて定義したパネル(p10)の部品を、フレームに載せる前にいじりたいと思っていますが、「☆」の部分で困っています。 内部で「add」「remove」する分には問題ないのですが、一旦外にでてしまうと、配列でしか「remove」できない状態です。 上記の挙動から、戻り値的には「ButtonClicked」上でコンテナ(p10)が見えていると思うのですが、配列以外(名前やID等、処理のたびに変動しないもの)で指定することはできないのでしょうか。 画面によってはループを考えていますので、必要な部分だけ追記したいのです。配列での指定ですと応用が辛いので・・。 尚、ソースが無駄に長いため 概念的な部分だけ抜き出しています。 「そもそも」な部分が多々あると思いますが、なにとぞよろしくお願いします。 ■Class Menu package test; //フレームの定義 public class Menu extends JFrame{     public static void main(String[] args) {         Menu frame_m = new Menu();         frame_m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         frame_m.setTitle("画面遷移テスト");         frame_m.setBounds(10, 10, 750, 570);         frame_m.setVisible(true);         frame_m.setResizable(false);     }     Menu() {     ~(省略)初期画面のパネル・部品・レイアウトに関する宣言~     panel_menu.add(t_label);     getContentPane().add(panel_menu);     validate();     } ■Class ButtonClicked package test; Class ButtonClicked implemments ActionListener{     //フレームを格納 パネル作成時の設置先として使用      public Menu owner;     //パネルを格納  前パネルの削除先として使用(getContentPane)     public Container subowner;     public void actionPerformed(ActionEvent ae) {             String cmd = ae.getActionCommand();             if (cmd.equals("btn_01")) {             //遷移画面の描写(パネルを被せる)                 Mondai obj = new Mondai();                 Container p10 = obj.drawPanel(owner);     //Class Mondaiにて定義したパネル上のコンポーネントJButton3)を削除したい     ☆問題の部分です(ERROR:「JButton3を解決できません」) //               p10.remove(JButton3);     ☆こっちだとOK (varidate後、表示されていない)                 p10.remove(3);//owner.list(System.out)参照                 owner.add(p10);                 owner.validate();             } else if (cmd.equals("btn_b02")) {             //別の処理hogehoge             } } ■Class Mondai package test; public Container drawPanel(Menu frame)throws Exception {     JPanel p10 = new JPanel();     ~(省略)遷移画面のパネル・部品・レイアウトに関する宣言~     p10.add(JButton1);     p10.add(JButton2);     p10.add(JButton3);     return p10; }

    • ベストアンサー
    • Java
  • Jframeの中にJframeを表示させたい

    Jframeの中にボタンを作り、ボタンを押すとJInternalFrameではなくJframeを表示させるようにしたいんですが、なかなかできません。 検索したりしてサンプル探したんですが、 Jframeを表示させ、ラベルを貼ったりしたいんですが どなたかお願いします!! public class Browser extends JFrame{ public static void main(String args[]) { Browser frame = new Browser(); frame.setTitle(""); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setVisible(true); } //ボタン private JButton bt = new JButton("~~"); public Browser() { bt.addActionListener(this); JToolBar tb = new JToolBar(); tb.setFloatable(false); getContentPane().add(tb, BorderLayout.NORTH); JPanel panel2 = new JPanel(); panel2.add(bt); panel2.setLayout(new FlowLayout(FlowLayout.LEFT)); tb.add(panel2); } //↓この辺りの処理の記述で頭が混乱してきました(泣 public class actionPerformed(ActionEvent e){ if(e.getSource() == bt){ Frame FW = new Frame(); FW.setSize(500,400); FW.setVisible(true); } } class Frame extends Frame{ public Frame(){ //コンストラクタの定義 } }

    • ベストアンサー
    • Java
  • GUI画面でsetBounds()で作成した画面は最大化ボタンが機能しない

    ちょっと題名がおかしくなってしまいましたが、 SwingでもAWTでも、setBounds()メソッドを使ってボタンなどを配置すると、最大化ボタンを押しても位置がそのまま表示されてしまうので、画面のデザインとしておかしくなってしまいます。 VBなんかだと最大化ボタンを押すとそれに応じてボタンやテキストボックスもちゃんと位置が移動します。 最大化ボタンを押しても適当に表示させる方法はないでしょうか?

    • ベストアンサー
    • Java
  • フレームを最大化させない

    AWTのFrameクラスのフレームで、最大化ボタンを押しても、最大化しないようにするにはどうしたらよいでしょうか。WindowListenerでも最大化に関するWindowEventをキャッチできません。何かよい方法はないでしょうか。よろしくお願いします。

    • ベストアンサー
    • Java
  • Netbeans6 swingでの画面切替について

    Netbeans6 swingでGUIアプリを作成しようとしています。 swingは初心者です。 簡単な画面切替ができず、理解に困っています。 画面構成 ・画面1 ・画面2 目的:画面1のボタンを押されると画面2を表示したい。 構成 ・MainFlame.java ⇒ フレームと画面1(パネルを定義) ・Panel01.java ⇒ 画面2(パネル) 今後、ログイン⇒メニュー⇒入力画面(複数)といった具合にしたいので、1画面1クラスで行いたいです。 こういった場合どうすれば画面がきりかわるのでしょうか? よろしくお願いします。 ボタンクリック時のイベント部分にはこう書いてますが動きません。 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: remove(jPanel1); Panel01 panel = new Panel01(); add(panel); validate(); }

    • ベストアンサー
    • Java
  • SwingでpaintcomponentとJToolBarを同時に使用する

    Swingを用いてウィンドウの中にツールバーと描画部分を作り、ツールバーのボタン操作などで描画を制御したりしたいのですが、描画部分だけが作成されてツールバーが表示されません。  今は描画するクラス、ツールバーを作成するクラス、mainのある統括するクラス3つを作って、作成しているのですがこれではいけないのでしょうか?間違ってるならどうしたらいいのでしょうか? すみませんが教えてください。

専門家に質問してみよう