• 締切済み

JPanelの重ね方/OverlayLayout他

添付した画像のような「ピラミッドのように大きいコンポーネントの上にだんだん小さなコンポーネントを重ねていく」のではないコンポーネントの重ね方がしたいです。そのようなことは可能なのでしょうか? やりたいこととしては、メインとなるパネルのその上で別のレイアウトをしたパネルを重ねたいです。 普通のレイアウトマネージャでaddで重ねるのでは、どうやってもうまくいきません。 OverlayLayoutも試してみましたが、以下の二つのパターンではうまくいきませんでした。 注:TopPanel,MainPanel,StringPanelはJPanelを継承した自作のクラスです 理想はMainPanel < StringPanel < TopPanelなのですが・・ JPanel basePanel = new JPanel(); basePanel.setLayout(new OverlayLayout(basePanel)); topPanel = new TopPanel(); topPanel.setOpaque(false); basePanel.add(topPanel); mainPanel = new MainPanel(); mainPanel.setLayout(new BorderLayout()); stringPanel = new StringPanel(); stringPanel.setPrintSpeed(50); stringPanel.setBorder(new BevelBorder(BevelBorder.RAISED)); mainPanel.add("South", stringPanel); basePanel.add(mainPanel); add(basePanel); この場合だと、MainPanel < TopPanel < StringPanelの関係になってしまいます JPanel basePanel = new JPanel(); basePanel.setLayout(new OverlayLayout(basePanel)); mainPanel = new MainPanel(); mainPanel.setLayout(new BorderLayout()); stringPanel = new StringPanel(); stringPanel.setPrintSpeed(50); stringPanel.setBorder(new BevelBorder(BevelBorder.RAISED)); mainPanel.add("South", stringPanel); basePanel.add(mainPanel); topPanel = new TopPanel(); topPanel.setOpaque(false); basePanel.add(topPanel); add(basePanel); こうするとTopPanelの描画が見えなかったのでおそらくTopPanel < MainPanel < StringPanelとなってます。 ご教示願います・・!

  • dossi
  • お礼率40% (11/27)
  • Java
  • 回答数2
  • ありがとう数11

みんなの回答

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

なんか返事がないから、追加発言するか迷ったが、レイヤー的なイメージと、提示ソースでのpanel の入れ子があってないと思う。 OverlayLayoutで、3つを重ね表示するなら、3つの大本となる basePanel に OverlayLayoutを設定した後、上におきたいものから順に、basePanel の子として全部addすればいいだけだと思う。OverlayLayout では、add順でしか重ね順は指定できない。 JLayeredPaneは、重ね順の変更が可能。

dossi
質問者

お礼

お礼を忘れていて本当に申し訳ありません・・! JLayerdPaneで層のある状態を作り出すことができました。 OverlayLayoutでは子の子(孫)のパネルが正しく扱われないということでしょうか。 まだどちらも正しく理解し、扱えているとは思えませんが、この問題について解決することができました。 本当にありがとうございました。

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

関連するQ&A

  • JPanelの切り替えと再描画

    ContainerにJPanelをaddし、ボタンを押すことで現在addされているJPanelとは違うJPanelを生成し、再描画させようとしているのですが、うまくいかないため、質問致しました。 -- src --- public class Test extends JFrame implements ActionListener {   Container container;   JPanel panel;   JButton btn;      public Test() {     container = getContentPane();     container.setLayout(new BorderLayout());     // ボタン用パネル     JPanel btnp = new JPanel();     btnp.setLayout(new FlowLayout());     container.add(btnp, BorderLayout.NORTH);          btn = new JButton("aaa");     btn.addActionListener(this);     btnp.add(btn);          // 対象のパネル     panel = new JPanel();       (略)panelの設定     container.add(panel, BorderLayout.CENTER);     setVisible(true);     setBounds(50, 50, 300, 300);     setDefaultCloseOperation(EXIT_ON_CLOSE);   }      public void actionPerformed(ActionEvent e) {     if (e.getSource() == btn) {       container.remove(1);       panel = new JPanel();  // 本来はJPanelを継承したクラスをnewしています       container .add(panel);       repaint();       // ※     }   }      public static void main(String args[]) {     Test t = new Test();   } } ※の箇所をcontainer.repaint() にしたり、paintImmediaely() にしたり出来そうな事を色々試したつもりではいるのですが、うまくいきません… ボタン押下後に、ウィンドウの枠をクリックすると描画されるのですが、いまいちよくわかりません… なにか分かる方いらっしゃいましたらご教授願います。

  • Layoutについて

    TextFiledを縦31、横7でレイアウトしたいのですが、 MyPanel(){ EventHandler eh = new EventHandler(this); JPanel ptext = new JPanel(); JPanel pbtn= new JPanel(); 中略 this.setLayout(new FlowLayout()); this.add(ptext,new FlowLayout(FlowLayout.CENTER,0,0)); this.add(pbtn, BorderLayout.SOUTH); とすると、横一列に表示されるのですが、どうしたら 指定したとおりになるのでしょうか? これは、mainで定義してます。 Container cont = frame.getContentPane(); cont.add(panel); よろしくお願いします。

    • ベストアンサー
    • Java
  • テキストエリアの大きさをドラッグで調節したい

    _____________________________ || | | | etc | | | ============================= | | | JTextArea | | | | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 上の図の=の部分を上下にドラッグすると、 JTextAreaの大きさを調節できるようにした いのですが、どうしたら良いのでしょうか? ソースは次のようにしています。 JPanel mainPanel = new JPanel(new GridLayout(2,1)); JPanel panel_1 = new JPanel(); panel_1.add(...); : etc部の追加 : mainPanel.add(panel_1); JPanel panel_2 = new JPanel(); panel_2.add(textArea); mainPanel.add(panel_2); getContentPane().add(mainPanel);

  • javaでストップウォッチが上手く作れません

    あるサイトを参考にして作ってみたんですが うまく動いてくれません、多分おかしいところだらけですが どこがダメか教えてもらえるとありがたいです package timeP; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; public class timeC extends JFrame implements Runnable { private JPanel contentPane; private JTextField textField; private Thread th = null; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { timeC frame = new timeC(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public timeC() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 85); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS)); JPanel panel_3 = new JPanel(); contentPane.add(panel_3); panel_3.setLayout(new BorderLayout(0, 0)); textField = new JTextField(); panel_3.add(textField, BorderLayout.CENTER); textField.setColumns(10); JPanel panel_2 = new JPanel(); contentPane.add(panel_2); panel_2.setLayout(new BorderLayout(0, 0)); JButton JButtonstart = new JButton(" 開始 "); JButtonstart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if ( th == null ) { th = new Thread ( ); th.start(); } } }); panel_2.add(JButtonstart, BorderLayout.CENTER); JPanel panel_1 = new JPanel(); contentPane.add(panel_1); panel_1.setLayout(new BorderLayout(0, 0)); JButton JButtonstop = new JButton(" 停止 "); JButtonstop.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if ( th != null ){ th = null; } } }); panel_1.add(JButtonstop, BorderLayout.CENTER); JPanel panel = new JPanel(); contentPane.add(panel); panel.setLayout(new BorderLayout(0, 0)); JButton btnNewButton_2 = new JButton("New button"); panel.add(btnNewButton_2, BorderLayout.CENTER); } @Override public void run() { //TODO 自動生成されたメソッド・スタブ int i; while ( th != null ){ i = Integer.parseInt( textField.getText() ); try { Thread.sleep(10000); if ( th == null ) break; } catch ( InterruptedException e ){ break; } textField.setText( Integer.toString( i + 1 ) ); } } }

  • JComboとJCheckとJPanelについて

    勉強しているのですが、書き方が全くわからないので、質問します。 この3つを使って図のようなプログラムをつくりたいのですが、どのように書いたらいいのでしょうか? ご教授お願いいたします。 中身をどのように書いたらいいのかまったくわからないんです・・・。 import java.awt.*; import javax.swing.*; public class HaitiRensyu extends JPanel{ public HaitiRensyu(){ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); addCheckBox(); addComboBox(); addButtons(); } private void addCheckBox(){ JPanel cboxPanel = new JPanel(); add(cboxPanel); } private void addButtons() { JPanel btnPanel = new JPanel(); add(btnPanel); } private void addComboBox() { JPanel comboPanel = new JPanel(); add(comboPanel); } public static void main(String[] args){ JFrame frame = new JFrame("JPanel"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); HaitiRensyu h = new HaitiRensyu(); frame.add(h, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } }

  • 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
  • 同じコンポーネントを複数の場所に配置したい

    SWINGを使ってGUIを作っています。 ボタンやテキストエリアを張り付けたパネルを別のパネルに複数貼り付けようしていますが、うまくいきません。 症状としては、最後に張り付けたところだけ表示されます。 簡単なプログラムを書いておきます。 JPanel mainpanel = new JPanel();//panelを複数貼り付けるパネル JPanel panel1 = new JPanel();//複数表示するパネル JButton btn1 = new JButton("btn1");//panel1貼り付けるボタン panel1.add(btn1); mainpanel.add(panel1);//一度目の貼り付け mainpanel.add(panel1);//二度目の貼り付け とすると二度目の貼り付けだけ表示されます。 同じものを複数の個所に表示するのは本来できないものなのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • JavaでのSwingを使った簡易電卓作成

    Javaについて勉強中の学生です。 よろしくお願いします。 CGIによるプログラムは一通り勉強しました。 次にGUIによるプログラムを勉強中です。 そこで電卓を作ってみようと思いましたが、よくわからないところがあります。 ご教示いただければ幸いです。 一応外見だけは作ることができましたが、イベントを登録するときに電卓のボタンをbtn1,btn2,btn3…とすればイベントを登録することはできるのですが、それだとボタンの分だけ作成しなければならず修正を加えるのが大変になってしまいます。 例)btn1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ hyozi.setText(hyozi.getText() + "1"); } } そこで「btn」に統一しボタンに表示されている文字列を使い簡潔にプログラムをまとめたいのですがどのようにすればよいのかわかりません。以下のプログラムに追加できるようなものを教えていただけないでしょうか? import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Dentaku{ private JFrame frame; private JPanel panel_fun,panel_ten; private JTextField hyozi; private JButton btn; public Dentaku(){ //フレームの作成してレイアウトをセット frame = new JFrame("簡易電卓プログラム"); frame.setLayout(new BorderLayout()); //パネルを作成してレイアウトをセット panel_fun = new JPanel(); panel_fun.setLayout(new GridLayout(2,3)); panel_ten = new JPanel(); panel_ten.setLayout(new GridLayout(4,3)); //表示用テキストボックスを作成 hyozi = new JTextField(); //電卓のボタンを作成 panel_fun.add(btn = new JButton("CA")); panel_fun.add(btn = new JButton("+")); panel_fun.add(btn = new JButton("-")); panel_fun.add(btn = new JButton("*")); panel_fun.add(btn = new JButton("/")); panel_fun.add(btn = new JButton("=")); panel_ten.add(btn = new JButton("1")); panel_ten.add(btn = new JButton("2")); panel_ten.add(btn = new JButton("3")); panel_ten.add(btn = new JButton("4")); panel_ten.add(btn = new JButton("5")); panel_ten.add(btn = new JButton("6")); panel_ten.add(btn = new JButton("7")); panel_ten.add(btn = new JButton("8")); panel_ten.add(btn = new JButton("9")); panel_ten.add(btn = new JButton("0")); //フレームに表示用テキストボックスをセット(BorderLayoutの北側) frame.add(hyozi,BorderLayout.NORTH); //フレームにパネルをセット(BorderLayoutの中央,南側) frame.add(panel_fun,BorderLayout.CENTER); frame.add(panel_ten,BorderLayout.SOUTH); //フレームの詳細設定 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300,250); frame.setVisible(true); } //mainメソッドの定義 public static void main(String[] args){ Dentaku application = new Dentaku(); } }

    • ベストアンサー
    • Java
  • Javaのレイアウトマネージャについてです

    ある課題で、この図のようなレイアウトになければいけないとの指定があるのでやってるんですがhttp://www.dotup.org/uploda/www.dotup.org3826.jpg.html 選択演算子の下のラベル(選択した演算子を表示するもの)がうまくレイアウトできません。ここまでは何とかたどり着いたんですが・・ http://www.dotup.org/uploda/www.dotup.org3828.jpg.html 自分が作ったソースはこちらです。 lb[0] = new JLabel("選択演算子"); lb[1] = new JLabel(" "); lb[2] = new JLabel("0"); lb[3] = new JLabel("です"); lb[0].setHorizontalAlignment(JLabel.LEFT); lb[0].setVerticalAlignment(JLabel.TOP); lb[1].setFont(new Font("Helvetica",Font.BOLD,20)); lb[1].setBorder(new EtchedBorder()); lb[1].setHorizontalAlignment(JLabel.LEFT); lb[1].setVerticalAlignment(JLabel.BOTTOM); lb[2].setFont(new Font("Helvetica",Font.BOLD,20)); lb[2].setBorder(new EtchedBorder()); lb[2].setHorizontalAlignment(JLabel.CENTER); lb[3].setHorizontalAlignment(JLabel.CENTER); bt_en[0] = new JButton("+"); bt_en[1] = new JButton("-"); bt_en[2] = new JButton("="); bt_en[3] = new JButton("C"); bt_en[4] = new JButton("AC"); cnt.setLayout(new GridLayout(3,1)); pn[0].setLayout(new BorderLayout()); pn[1].setLayout(new GridLayout(4,3)); pn[2].setLayout(new FlowLayout()); pn[0].add(lb[0],BorderLayout.WEST); pn[0].add(lb[1],BorderLayout.SOUTH); pn[0].add(lb[2],BorderLayout.CENTER); pn[0].add(lb[3],BorderLayout.EAST); どのようにすればいいのか教えていただきたいです。 ちなみに使っている教科書は「やさしいJava活用編」です。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Java JPanelを使ったコードについての質問です

    Java JPanelを使ったコードについての質問です 4つのTextFieldに数値を入力し、エンターキーが押されたときに円グラフが表示されるプログラムについての質問です。 下記のコードなのですが、何故かエラーが出てしまいます… public class PieCharts extends JPanel implements ActionListener { private JLabel l1, l2, l3, l4; private JTextField t1, t2, t3, t4; private JButton bt; private JPanel pn1,pn2; int h, m, l, n, w, x, y, z; private DrawOvalPane dop; public static void main(String args[]) { JFrame frame = new JFrame("Applet"); frame.setContentPane(new PieCharts()); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } public PieCharts() { dop = new DrawOvalPane(); l1 = new JLabel("High Risk", JLabel.RIGHT); l2 = new JLabel("Medium Risk", JLabel.RIGHT); l3 = new JLabel("Low Risk", JLabel.RIGHT); l4 = new JLabel("No Risk", JLabel.RIGHT); t1 = new JTextField(); t1.addActionListener(this); t2 = new JTextField(); t2.addActionListener(this); t3 = new JTextField(); t3.addActionListener(this); t4 = new JTextField(); t4.addActionListener(this); bt = new JButton("Enter"); pn1 = new JPanel(); pn2 = new JPanel(); pn1.setLayout(new GridLayout(2,4)); pn1.add(l1); pn1.add(t1); pn1.add(l2); pn1.add(t2); pn1.add(l3); pn1.add(t3); pn1.add(l4); pn1.add(t4); pn2.add(bt); setLayout(new BorderLayout()); add("North", pn1); add("Center", dop); add("South", pn2); bt.addActionListener(new SampleActionListener()); }

専門家に質問してみよう