Dimensionクラスの使い方

このQ&Aのポイント
  • Javaを始めたばかりの者です。参考書を読みながら進めていて、Dimensionクラスの使用方法について質問があります。具体的には、以下のコードでDimensionクラスを使用している箇所が理解できません。
  • 質問者はJavaを始めたばかりで、参考書を読みながら進んでいます。Dimensionクラスの使用方法について質問があります。質問者が行き詰まっているのは、以下のコード内でDimensionクラスを使用している箇所です。
  • Javaを初めたばかりの人が、Dimensionクラスの使い方に関して質問しています。具体的には、以下のソースコードでDimensionクラスが使用されている部分が理解できません。
回答を見る
  • ベストアンサー

Dimensionクラスの使い方

Javaを始めたばかりの者です。 参考書を読みながら進めていて下記のソースコードで Dimensionクラスを使用している箇所で行き詰まりました。 使われていたのは、以下のコード --------------------------------------------------------------------------------------------------------------------- import java.awt.*; import javax.swing.*; import java.util.*; class xxx{  static public void main(String[] argv){  /*標準入力からmsgに文字列を入力*/  String msg = scan.next();  /*JLabelクラス型のオブジェクト型変数を作成し、インスタンスを生成*/  JLabel label = new JLabel(msg);  /*JLabelのインスタンスのコンストラクタに入力されたmsgのサイズを取得*/  Dimension dim = label.getPreferredSize();  ・・・etc  } } ---------------------------------------------------------------------------------------------------------------------- 自分が今まで使ってきたクラスは下記のような感じで使っていましたが、ここではnewしていない。 これは、どういうことなんでしょうか? クラス名 dim = new クラス名(); インスタンス作成 = コンストラクタの呼び出し。 new演算子はクラスのコンストラクタを呼び出している理解ですが Dimension dim = label.getPreferredSize(); 上記のコードではDimentionクラスのインスタンスは作られていないということだと思います。 ということは、 ここでは何をしているのでしょうか? どなたか、教えて下さい。

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

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

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

> インスタンスを生成せずにこの様な使い方をしているのはどういう理屈なのでしょうか? Javaのインスタンスは必ずどこかで誰かがnewで生成したものであって、生成せずにインスタンスのフィールドやメソッドを使用することはできません。 質問文にある例でも、どこかでDimensionのインスタンスが生成されています。ただし、getPreferredSize()を呼ぶ人はその詳細を知る必要はなくて「getPreferredSize()を呼べば(どこかでnewされた)Dimensionのインスタンスが返ってくる」ことだけ理解していればいいのです。

unmarko
質問者

お礼

回答有難うございます。 なるほど、インスタンスはどこかで誰かが必ず生成したものであって、生成せずにインスタンスのフィールドやメソッドを使用することはできない。 覚えておきます。 昨日からずっと気になっていました。やっと先に進めます。 >getPreferredSize()を呼ぶ人はその詳細を知る必要はなくて「getPreferredSize()を呼べば(どこかでnewされた)Dimensionのインスタンスが返ってくる」ことだけ理解していればいいのです。 なるほどー。 有難うございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

label.getPreferredSize() の中で作ってるか何かしてるんじゃないの?

unmarko
質問者

補足

回答ありがとうございます。 ちょっと、質問の仕方が悪かったようで申し訳ありません。 すいません、オブジェクト指向とかクラスという概念自体始めてなので 混乱しています。 もっと基本的なことで、 クラス名A 変数名 = new クラス名Aという使い方しか知らないので、 今回のような場合はどう解釈すれば良いのでしょう? また、今回の場合後々dim.widthという値を使っていました。 これはDimensionクラスに有るwidthというフィールドを使っているんだと思うのですが、 インスタンスを生成せずにこの様な使い方をしているのはどういう理屈なのでしょうか?

関連するQ&A

  • javaでスタート画面を作っていて困っています。

    現在javaでゲームのスタート画面を作っているのですが、パネルが透過されずに困っています。 プログラムソースは import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.*; import java.awt.Font; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.*; import java.awt.event.*; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.border.LineBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import java.awt.Container; class Start最新版 extends JFrame{ public static void main(String args[]){ Start最新版 frame = new Start最新版("タイトル"); frame.setVisible(true); } Start最新版(String title){ setTitle(title); setBounds(10, 10, 1024, 768); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); p.setOpaque( false ); ImageIcon icon1 = new ImageIcon("Start.jpg"); JLabel label1 = new JLabel(icon1); JLabel label2 = new JLabel(); p.add(label1); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); JButton button1 = new JButton("ゲームを始める"); button1.setFont(new Font("Mairyo", Font.PLAIN, 30)); JPanel n = new JPanel(); n.setOpaque(false); n.setLayout(new BoxLayout(n, BoxLayout.Y_AXIS)); n.add(Box.createRigidArea(new Dimension(290,30))); n.add(button1); となっています。「ゲームを始める」ボタンだけを残して、周りのパネルを透過して画像を表示させたいのですが、うまくいきません!解決方法をご存知の方どうか教えていただきたいです!よろしくお願いします。

  • 「削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください」とコンパイルエラーになってしまいます!

    下記のソースコードをコンパイルすると 「HelloWorldSwing.java:6: JFrame にアクセスできません。 クラスファイル .\JFrame.java は不正です。 ファイルにクラス JFrame が含まれていません。 削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。 JFrame frame = new JFrame("HelloWorldSwing");」 と表示されてしまいエラーになってしまいます。 どなたか、分かる方がいましたらアドバイスください!! <HelloWorldSwing.java>--------------------------- import javax.swing.*; public class HelloWorldSwing { public static void main(String[] args) { JFrame frame = new JFrame("HelloWorldSwing"); final JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } } -------------------------------------------------

    • ベストアンサー
    • Java
  • 親クラスのコンストラクタは? 引数付きコンストラクタは?

    VisualBasic.NETです。 あるクラスを継承したクラスからインスタンスを作成したときに、派生クラスのコンストラクタは呼び出されると思うのですが、基本クラスのコンストラクタはどうなるのでしょうか? JAVAのように、super() で呼び出す必要があるのでしょうか? 自動で呼び出されるのでしょうか? それとも、そもそも呼び出せないのでしょうか? また、引数の個数が違うコンストラクタは、同じクラス内に設定できるのでしょうか? JAVAのコードを移植しようと考えているのですが、出来るのかどうかが分からずに悩んでいます。 ご存じの方、よろしくお願いします。

  • 配列に対してsetText()は使えないんでしょうか?

    こんにちは、いつもお世話になっております。 3つのラベルの配列に文字列を表示したいのですが 下記のコードをコンパイルし実行すると、 Exception in thread "main" java.lang.NullPointerException at txtest.main(txtest.java:16) というエラーが出てしまいます。(コンパイルはできる。) 「setText()」を「=new JLabel(right1)」という風に書き変えると 正しく、表示されるのですが、この方法は使いたくないのです。 何かよい方法ご存知でしたら、是非教えていただけますか? どうかよろしくお願いいたします。 import java.awt.*; import javax.swing.*; class txtest { public static void main(String[] args) { JFrame f=new JFrame(); JPanel p=new JPanel(); JLabel label[]=new JLabel[3]; label[0].setText("right1"); label[1].setText("right2"); label[2].setText("right3"); for(int i=0;i<=2;i++) { p.add(l[i]); } Container ct=f.getContentPane(); ct.add(p); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.pack(); f.setVisible(true); } }

    • ベストアンサー
    • Java
  • javaのボタン表示等に関する質問

    下記のコードはフォームをNORTH、CENTER、SOUTHEに分割して、それぞれのpaneに ラベルとボタンを表示するものです。 Q1)myFrame.setBounds(350,0, total_x, total_y)をコンストラクターの最初に記述しますと  フォームの表示が正常でなく、コンストラクターの最後では、正常に行なわれます。  この理由等について、コメント頂けますと有り難いです。 Q2)mainに記述してある、下記のコードは無くても、Xでクロースできますが,このコード  の記述は正しいでしょうか GridLayout_new frame = new GridLayout_new(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 以上お手数ですが、コメント頂けますと大変助かります。 //============================================= 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.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){ GridLayout_new frame = new GridLayout_new(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } GridLayout_new(){ JFrame myFrame=new JFrame(); myFrame.setTitle("panelA"); // myFrame.setBounds(350,0, total_x, total_y); //正常なformの表示が出来ない myFrame.setVisible(true); 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); myFrame.setSize(panelA_x, panelA_y); myFrame.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); myFrame.setSize(panelB_x, panelB_y); myFrame.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); myFrame.setSize(panelC_x, panelC_y); myFrame.getContentPane().add(p3, BorderLayout.SOUTH); myFrame.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); } } //main class....GridLayout_new

    • ベストアンサー
    • Java
  • ボタンクリック後パネルを再描画repaintしたい

    ボタンをクリック後にstaticで保持していた値にプラス1して その値をパネルに再描画したいと思っています。 下記のプログラムだとボタンをクリックすると (<1<2<3<4)となって画像と数字が増えてしまいます 行いたいのは数字の部分だけが再描画されて カウントされて<3と表示されるだけになってもらいたい クラス1つ目 import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Sample extends JFrame{ static int value=1; JPanel work = new JPanel(); public static void main(String[] args) { Sample frame = new Sample(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(100, 200, 200, 100); frame.add(frame.createPanel(), BorderLayout.LINE_END); frame.setVisible(true); } public JPanel createPanel() { ImageIcon icon = new ImageIcon("./img/left.gif"); JLabel label = new JLabel(); Cursor c = new Cursor(Cursor.HAND_CURSOR); label.setCursor(c); label.setIcon(icon); JLabel strLabel = new JLabel(); String str = Integer.toString(value); strLabel.setText(str); work.add(label); work.add(strLabel); label.addMouseListener(new myListener()); return work; } class myListener extends MouseAdapter{ public void mouseClicked(MouseEvent e){ System.out.print(Sample.value++); createPanel().repaint(); setVisible(true); } } } クラス2つ目 import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class MouseAdapter implements MouseListener{ public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} }

    • ベストアンサー
    • Java
  • インスタンスを同じ名前で作成できる?

    最近Javaの勉強を始めました。 入門書に従って進めているのですが、 例題に下記のようなプログラムが載っていました。 for文の中でインスタンスを作ってループさせているのですが、 下記のプログラムだと"fusen" "label"という同名のインスタンスが複数できることになると思います。 結果は複数の付箋がデスクトップに表示されるので参考書通りといえばそうなのですが、 同名のインスタンスが複数作成されてしまうというのは例えば同じ名前の変数が複数、しかも同じブロック内で作成されてしまうというのと同じような気がします。 後々3番目に作ったインスタンスのメソッドだけを使いたいとかと思った場合、 困るのではないかと思いますし、そもそも同じ名前のインスタンスを複数作れるというのは 有りなのでしょうか? 上手く説明できないのですが、何だか気持ち悪くてしょうがありません。 どなたかアドバイス頂けないでしょうか? (注) "Dodai"クラスは入門書付属の拡張ライブラリなのですが、 デスクトップに付箋を表示するためのクラスです。 "JLabel"クラスは"Java Platform Standard Edition 6"のものを使用しています。 ----------------------------------------------------------- public static void main(String[] args){ //外側の繰り返し for( int i = 1; i <= 9; i++ ){ //内側の繰り返し for( int k = 1; k <= 9; k++ ){ Dodai fusen = new Dodai(); JLabel label = new JLabel(); label.setText(i + "x" + k + "=" + ( i*k )); fusen.add(label); fusen.setSize(50, 30); fusen.setLocation(i * 60, k * 40); fusen.setVisible(true); } } }

    • ベストアンサー
    • Java
  • JAVAでの背景画像表示

    現在javaでゲームのメニュー画面を作っているのですが、ボタンを配置する所まではできたんですが、背景に画像を表示することができなくて困っています! import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.border.LineBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import java.awt.Container; public class Mati extends JFrame{ public static void main(String[] args){ Mati frame = new Mati(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10,650,650); frame.setTitle("街"); frame.setVisible(true); JPanel h = new JPanel(); h.setOpaque(false); ImageIcon icon1 = new ImageIcon("Mati.jpg"); JLabel label1 = new JLabel(icon1); JLabel label2 = new JLabel(); h.add(label1); } Mati(){ JButton button1 = new JButton("宿屋"); button1.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button2 = new JButton("道具屋"); button2.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button3 = new JButton("武器屋"); button3.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button4 = new JButton("街を出る"); button4.setFont(new Font("Mairyo", Font.PLAIN, 30)); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); p.add(Box.createRigidArea(new Dimension(10,30))); p.add(button1); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button2); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button3); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button4); getContentPane().add(p, BorderLayout.CENTER); } } ソースはこのようになっています。これからどうすれば背景画像が表示されるか教えていただきたいです。 よろしくお願いします。

  • コンストラクタの動作について

    下記のソースについて質問があります。 public class Test{ private String msg; public Test(){ this("Good morning"); } public Test(String msg){ msg = msg; } public String toString(){ /*(2)*/ return ("msg:" + msg); } public static void main(String args[]){ System.out.println(new Test()); /*(1)*/ } } このコードをコンパイルした出力結果は、 msg:null となるのですが、ここの仕組みがわかりません。 (1)でTestクラスのコンストラクタを呼び出し、msgに"Good morning"を設定し、 処理が終わると思うのですが、(2)の処理も行われてしまいます。 (1)では、Testのコンストラクタを設定しているだけに見えてしまうのですが、 (2)まで処理が行われるのは、何故かのかをご教授の程お願い致します。

    • ベストアンサー
    • Java
  • クラスとインスタンスについて

    入社1年目のプログラミング経験0のSEです! Javaのクラスとインスタンスについてぜんぜん理解できません! 下のソースをどうしたらいいのかわからないです。 import java.io.*; class SumAndAvgMain{ public static void main(String argv[]){ BufferedReader r = new BufferedReader(new InputStreamReader(System.in),1); try{ //3教科の得点を入力しintに変換 //SumAndAvgクラスのインスタンスを作成 //合計点及び平均点を出力する。 }catch(IOException e){ System.out.println("例外発生"+e); } } } class SunAudAvg{ public static void main(String args[]){ //各教科の得点用のフィールド int kokugo; int suugaku; int eigo; //SumAndAvgクラスのコンストラクタ SumAndAvg(int kokugo,int suugaku,int eigo){ //フィールドに国語の点数を代入 //フィールドに数学の点数を代入 //フィールドに英語の点数を代入 } //3教科の合計点を求める int getGoukei(){ } //3教科の平均点を求める double getHeikin(){ } }

専門家に質問してみよう