- ベストアンサー
javaのボタン表示等に関する質問
- Javaのフォームを分割してラベルとボタンを表示するコードの正常表示に関する質問
- コンストラクターの位置によってフォームの表示が異なる理由についての質問
- mainメソッド内のコードの正しさについての質問
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 >上記のコードに関しまして、button1は『クラスJLabel("Label1")』のinstanceであり、 まあ、だいたいあっているのではないでしょうか。 >メモリー上に展開されたコードを指すものと考えて宜しいでしょうか? ただ、これはちょっと違うかもしれませんね。 オブジェクト指向のクラスは、乱暴に言ってしまうと、「C言語で言う構造体とその構造体に関連する関数を合体させた物」と言えます。 構造体の部分がクラスで言うインスタンス変数、関数がメソッドになります。 クラスが new されるとヒープメモリにインスタンス変数(構造体)を記録する領域が確保されます。メソッド(関数)は各インスタンスで共通なので、いちいち新しくメモリに確保されることなくクラスの物が使い回されます。
その他の回答 (2)
- PecoPlus
- ベストアンサー率76% (144/188)
#1です。 修正するとしたら、こんな感じではないでしょうか。 メインメソッド内のおまじないについては、サンプルコード程度ならしなくてもかまわないと思いますので、気にしなくていいです。 (コンパイルするときは、全角スペースを半角スペースに置換してからにして下さい) import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.border.LineBorder; public class GridLayout_new extends JFrame { int panelA_x = 200, panelA_y = 50; int panelB_x = 200, panelB_y = 200; int panelC_x = 200, panelC_y = 50; int total_x = panelA_x; int total_y = panelA_y + panelB_y + panelC_y; public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable( ) { @Override public void run() { GridLayout_new frame = new GridLayout_new(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); } GridLayout_new() { this.setTitle("panelA"); this.setBounds(350,0, total_x, total_y);//正常なformの表示が出来ない LineBorder border = new LineBorder(Color.BLACK, 1, true); //======================== JLabel button1 = new JLabel("Label1"); GLabel_Layout(button1, border); JButton button2 = new JButton("button2"); button_Layout(button2, border); //======================== JLabel button3 = new JLabel("Label3"); GLabel_Layout(button3, border); JButton button4 = new JButton("button4"); button_Layout(button4, border); //======================== JLabel button5 = new JLabel("Label5"); GLabel_Layout(button5, border); JButton button6 = new JButton("button6"); //======================== JLabel button7 = new JLabel("Label7"); GLabel_Layout(button7, border); JButton button8 = new JButton("button8"); //======================== JLabel button9 = new JLabel("Label9"); GLabel_Layout(button9, border); JButton button10 = new JButton("button10"); button_Layout(button10, border); //======================== JLabel button11 = new JLabel("Label11"); GLabel_Layout(button11, border); JButton button12 = new JButton("button12"); button_Layout(button12, border); //================================== JPanel p1 = new JPanel(); GridLayout layout1 = new GridLayout(2, 2);//2行、2列の設定 layout1.setHgap(2); layout1.setVgap(10); p1.setLayout(layout1); p1.setBackground(Color.GREEN); p1.add(button1); p1.add(button2); p1.add(button3); p1.add(button4); this.getContentPane().add(p1, BorderLayout.NORTH); //============================== JPanel p2 = new JPanel(); GridLayout layout2 = new GridLayout(2, 2);//2行、2列の設定 layout2.setHgap(2); layout2.setVgap(10); p2.setLayout(layout2); p2.setBackground(Color.GREEN); p2.add(button5); p2.add(button6); p2.add(button7); p2.add(button8); this.getContentPane().add(p2, BorderLayout.CENTER); //================================== JPanel p3 = new JPanel(); GridLayout layout3 = new GridLayout(2, 2);//2行、2列の設定 layout3.setHgap(2); layout3.setVgap(10); p3.setLayout(layout3); p3.setBackground(Color.GREEN); p3.add(button9); p3.add(button10); p3.add(button11); p3.add(button12); this.getContentPane().add(p3, BorderLayout.SOUTH); this.setBounds(350, 0, total_x, total_y);//正常なformの表示 }//constructor void GLabel_Layout(JLabel label, LineBorder border) { label.setPreferredSize(new Dimension(80, 20)); label.setBorder(border); label.setBackground(Color.lightGray); label.setOpaque(true); } void button_Layout(JButton button, LineBorder border) { button.setPreferredSize(new Dimension(80, 20)); button.setBorder(border); } }
補足
PecoPlus さま 丁寧、簡明な回答有難うございます。 これから、検討、勉強いたします。 その他質問:instanceについて ついでに下記についてコメント頂けますと有り難いです。 JLabel button1 = new JLabel("Label1"); 上記のコードに関しまして、button1は『クラスJLabel("Label1")』のinstanceであり、 メモリー上に展開されたコードを指すものと考えて宜しいでしょうか? instanceの和訳を辞書で見ましたが、今ひとつ不明なので、ここに質問させて頂きました。 以上
- PecoPlus
- ベストアンサー率76% (144/188)
こんにちは。 Q1.について コンストラクタ内でなんどもフレームのサイズを変更しています。これが影響しています。 おそらくパネルのサイズを変更しようとして間違えたのだと思いますが、レイアウトを使用してコンポーネントを配置している限り、このパネルのサイズ変更も意味はありません。 各コンポーネントの位置ととサイズをいい感じに設定してくれるのがレイアウトの役目ですから、手動で設定しても、結局レイアウトに変更されてしまうので効果はありません。 Q2.について 正しくありません。 ウィンドウは消えていますが、アプリケーションは終了していません。 コードを変更しても、変化がないように見えるのは、元々のコードが間違っているためです。 クラス GridLayout_new 自体は JFrame を継承しているにもかかわらず、コンストラクタ内で新しい JFrame を new しており、これを表示させています。 ですので、GridLayout_new に対して行った frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); まったく、無意味になっています。 余分なフレールを作らず、GridLayout_new 自身を表示されるように変更すべきです。
お礼
PecoPlus さん >まったく、無意味になっています。 余分なフレールを作らず、GridLayout_new 自身を表示されるように変更すべきです。 <--この作り方が、わかりません。 以上
補足
PecoPlus さん Q1)、Q2)に関して、コメント有難うございます。 貴方のご指摘の通りだと思います。 もし、出来れば、もう少し具体的に、お教え頂けないでしょうか? 以上
補足
PecoPlus さま >クラスが new されるとヒープメモリにインスタンス変数(構造体)を記録する領域が確保されます。メソッド(関数)は各インスタンスで共通なので、いちいち新しくメモリに確保されることなくクラスの物が使い回されます。 <---了解 明快な、有難うございました。