ここから質問投稿すると、最大4000ポイント当たる!!!! >>

JavaでdrawStringを使って文字を出力しますが、180度回転した文字
逆さ文字を表示させたいのですが、どのように記述すればよいのでしょうか?

g.drawString("あ", 10,10); //あを逆さにしたい。

また、180度でなく、好みの角度の表示も可能でしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

こんにちは。

文字などのグラフィックスを回転させる場合はjava.awt.Graphics2Dクラスが使えます。
他にも方法があるかもしれませんが、一例です。

BuffredImageを作成し、そこにGraphics2Dで描画、最後にコンポーネントへBuffredImageを描画しています。
ポイントは3.14で180度ということと、回転(rotate())させてからdrawString()というところです。
- - - - - - - - - - - - - - - - - - - -
import java.awt.*;
import java.awt.image.*;

class RView extends Component
{
public RView() {super();}

public void paint(Graphics g) {
Dimension d;
BufferedImage bi;
Graphics2D g2;

d = getSize();
bi = new BufferedImage(d.width, d.height,
BufferedImage.TYPE_4BYTE_ABGR);
g2 = bi.createGraphics();
g2.setColor(Color.blue);
g2.fillRect(0, 0, d.width, d.height);

// 回転
// 3.14=180度
// 200.0=横方向位置修正
// 150.0=縦方向位置修正
g2.rotate(3.14, 200.0, 150.0);

g2.setColor(Color.yellow);
g2.setFont(new Font("Serif", Font.BOLD, 24));
g2.drawString("Rotated String!!", 200, 150);

g.drawImage(bi, 0, 0, Color.white, null);
}

}

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/java …
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

Q描画処理が実行されない

while(gameflag==true){
(数値設定)   
repaint();
long start = System.currentTimeMillis();
while(System.currentTimeMillis()<start+1000){
}
}

上記のようにwhileループの中で数値などの設定を行い、描画をし、遅延をしているのですが他の処理はちゃんと実行されるのになぜか描画処理だけが行われません。また、whileループ外でも描画を行っていますがその時点ではきちんと描画されます。描画されない原因はどのようなことが考えられるでしょうか?描画はpaintComponent(Graphics g) メソッドで描画しています。

Aベストアンサー

>描画されない原因はどのようなことが考えられるでしょうか?

Swingの描画はダブルバッファを使っている関係上、描画メソッドを呼び出したときではなく、その後、もっとも早く再描画できるタイミングで表示を更新します。このため、while内で描画を行っている場合には、そのwhileを抜け、処理が終了した頃で表示が更新されるため、while中で行っている描画処理は見えません。(途中の描画は見えず、最終的に描画された状態だけが表示される)

この処理は、別スレッドを使って実行していますか? メインスレッドでは、上のような理由で途中の更新は見えませんから、マルチスレッドで実行し、描画ごとに強制的にrepaintするなどしてみてはいかがでしょう。

QdrawStringで文字間隔の調整

Graphics.drawString()を使用して文字を描画するときに
その文字間隔を設定したいと思っていますが、方法はございますでしょうか?

FontMetrics等を確認しましたが、文字間隔を設定する
ようなメソッドはありませんでした。

試しに、一文字ずつFontMetrics.getWidths(hogehoge)で文字幅を取得して、描画してみましたが、getWidthsの結果が正しく戻ってこない場合もあり、且つ設定できる文字間隔がInt型となることから当方の希望する精度での
文字間隔の設定はできませんでした。

どなたか、ご存じの方はいらっしゃいますでしょうか?

Aベストアンサー

 こんばんは。

 スマートなやり方なのかどうかわからないのですが、一文字づつdrawStringしていくのはどうでしょう?

 たとえば、こんな↓メソッドを用意して、paintメソッドやpaintComponentメソッドから呼んだらどうでしょう?

public static void drawIntervalString(Graphics g, String string, int x, int y, int interval) {
  if (interval > 0) {
    FontMetrics metrics = g.getFontMetrics();
    for (int i = 0; i < string.length(); i++) {
      char moji = string.charAt(i);
      g.drawString(Character.toString(moji), x, y);
      x = x + metrics.charWidth(moji) + interval;
    }
  }
  else {
    g.drawString(string, x, y);
  }
}

 また、より細かくしたい場合は、Graphics2Dを使うようにこういう風に↓することもできると思います。

public static void drawIntervalString(Graphics2D g, String string, float x, float y, float interval) {
  if (interval > 0) {
    FontMetrics metrics = g.getFontMetrics();
    for (int i = 0; i < string.length(); i++) {
      char moji = string.charAt(i);
      g.drawString(Character.toString(moji), x, y);
      x = x + metrics.charWidth(moji) + interval;
    }
  }
  else {
    g.drawString(string, x, y);
  }
}

 こんばんは。

 スマートなやり方なのかどうかわからないのですが、一文字づつdrawStringしていくのはどうでしょう?

 たとえば、こんな↓メソッドを用意して、paintメソッドやpaintComponentメソッドから呼んだらどうでしょう?

public static void drawIntervalString(Graphics g, String string, int x, int y, int interval) {
  if (interval > 0) {
    FontMetrics metrics = g.getFontMetrics();
    for (int i = 0; i < string.length(); i++) {
      char moji = string...続きを読む

QJava、jPanelに描画する

お世話になっています。
Java言語を始め、オブジェクト指向というなれない環境にいます。(今まではBASICを利用)

今回、jPanelなるものを使い、その中に四角形などを描画したいのですが、
うまくいきません。

public void paintComponent(){
Graphics pnl = panel.getGraphics();
pnl.setColor(new Color(0,0,255));
pnl.drawOval(100,100,50,50);
}

こういう関数を作り、プログラムから呼び出しています。(フレーム作成時には表示しない)
おそらくこの辺りがダメだと思うのですが、よくわかりません。

すいませんが、jPanelの使い方を詳しく教えていただけないでしょうか。
ゲームを作る課題なのですが、ここで詰まってしまい進めません。

ご存じの方がいらっしゃいましたら、ご教授ください。
よろしくお願い致します。

Aベストアンサー

このクラスの定義をざっくり書くと、

class Frame extends JFrame{
 Jpanel panel = new Jpanel(); //描画領域
 Jpanel label = nel Jpanel("得点");
 JButton btnNewButton = new JButton("ヘルプ");

 public Frame(){
  いろいろコンポーネントを追加...
  btn.newActionListener(this);
  this.setVisible(true);★
 }

 actionPerformed(ActionEvent e){
  this.repaint(); //自身のインスタンス(フレームを再描画)
 }
}

と推測しました。★のタイミングでpaintComponent(Graphics g)が呼び出されます。引数Graphics ???(なんでもよい)は必要です。描画が必要なタイミングでpaintComponentメソッドを呼び出します。詳しくは後述。

>はよく見るカタチのサンプルですが、これは呼びださなくてもjFrameだけなら描画されていることがないですかね?^^;
回答はJPanelを想定しております。
JFrameに対して、setVisible(true)した段階では、JPanelのpaintComponentのことまで構っていないように感じられますが、きちんと伝搬されます。 contentPane.add によってJpanelをJFrameに追加しているためです。

描画の際は、描画対象となるオブジェクトの情報がGraphicsクラスに入っているため、Graphicsのインスタンスを参照します。Graphics gならば"g"がインスタンスにあたります。

>引数に何を渡しているのか、それはどうやって取得するのか……
paintComponentの引数は(Graphics g)が必須だったと思います。
"paintComponent Java" をキーワードとして検索します。JComponentのクラスに関するドキュメントが得られます。クラスドキュメントを参照する限りでは、引数Graphics gは必須です。その他の条件のpaintComponentメソッドがここに記載されていないためです。

http://docs.oracle.com/javase/jp/6/api/javax/swing/JComponent.html#paintComponent(java.awt.Graphics)
Jpanelじゃないの?という疑問が生まれると思いますが、前提をお読みください。

java.lang.Object
 └java.awt.Component ◎
  └java.awt.Container
    └javax.swing.JComponent ★
      └javax.swing.JPanel ☆

(前提)
1)お示ししたURLは★のJComponentですが、☆のJPanelから上位のクラスで定義されているメソッドを参照することができます。今回は継承と呼びます。
2)定義済みのメソッドをプログラマ自身が書き換えることができます。これをオーバーライドと言います。
3)特に定義しなくても★のpaintメソッドでpaintComponent(Graphics g)を呼ぶよう定義されているため、プログラマは、paintComponent(Graphics g)を定義すればよいことになります。

(重要)
・paintComponent(Graphics g)が発生するのは、イベントが発生して、FrameやPanelに描画の必要が生じた時です。例えばフレームの表示、サイズの変更が挙げられます。他にもあるかもしれませんが全てを把握しておりません。
JFrame.setVisible(true)を強調しているのは、これが発行されるまでJFrameに配置したコンポーネントのpaintComponentが呼ばれることがないためです。

paintComponent()と定義することはできますが、Javaは、paintComponent(Graphics g)に対して呼び出しをかけるので、定義されたメソッドは呼び出されないことになります。

プログラム上の処理が発生して、再描画が必要であれば、そのコンポーネントに対して、repaint()を起こすことになります。その延長でpaintComponent(Graphics g)が呼び出されます。repaintは◎で定義されているメソッドです。前提1に基づいて呼び出し可能となります。

>(※1)System.out.printlnでnullpointerが返ってきていないのでそう判断
これは再上位から「標準出力」をとっているだけなので、NullPointerは返りません。ハンドル(Javaではインスタンス)が取得できていることにはなりません。

>Javaにはデバイスコンテキストという概念が表に出ていないと聴きました。
インスタンスという概念で特定をします。
例えば、paintComponent(Graphics g)の場合、

paintComponentメソッドは、Graphicsクラスの gインスタンス(変数)を引数に持つ。という意味になります。デバイスハンドラやデバイスコンテキストはインスタンスになっているという認識で私はいます。
また、paintComponent()としてしまうと、引数を持たないpaintComponentメソットとなります。同時に定義することができる全く違うメソッドになってしまうので注意が必要です(多相性といいます)。

このクラスの定義をざっくり書くと、

class Frame extends JFrame{
 Jpanel panel = new Jpanel(); //描画領域
 Jpanel label = nel Jpanel("得点");
 JButton btnNewButton = new JButton("ヘルプ");

 public Frame(){
  いろいろコンポーネントを追加...
  btn.newActionListener(this);
  this.setVisible(true);★
 }

 actionPerformed(ActionEvent e){
  this.repaint(); //自身のインスタンス(フレームを再描画)
 }
}

と推測しました。★のタイミングでpaintComponent(Graphics g)が呼び...続きを読む

Qボタンの複数割り当てについて

public class TestButton extends Applet implements ActionListener
{
     Button bt1,bt2,bt3;

     public void init()
     {
         bt1 = new Button("red");
         add(bt1);
         bt2 = new Button("blue");
         add(bt2);
         bt3 = new Button("yellow");
         add(bt3);
         bt1.addActionListener(this);
      }

java初心者です。アプレットで上のようにボタンを作ります。それぞれが押された時に、red,blue,yellowが表示されるようにしたいのです。ActionListenerをインプリメントしているので、

     public void actionPerformed(ActionEvent ae)

をオーバーライドする必要がありますが、そこで質問です。
ボタンを3種類別々に関連づけるには、actionPerformed内をどのように記述したらよいでしょうか?また、init内はこれだけでいいんでしょうか?
よろしくお願いします。

public class TestButton extends Applet implements ActionListener
{
     Button bt1,bt2,bt3;

     public void init()
     {
         bt1 = new Button("red");
         add(bt1);
         bt2 = new Button("blue");
         add(bt2);
         bt3 = new Button("yellow");
         add(bt3);
         bt1.addActionListener(this);
      }

java初心者です。アプレットで上のようにボタン...続きを読む

Aベストアンサー

これは色々やり方があります。
ボタンをメンバ変数として定義してActionEventの
getSource()メソッドでEventが発生したObjectと
比較するとか、getSource()で取得したオブジェクト
をButtonにキャストしてからgetLabel()でラベルの
文字列を取得し任意の文字列と比較するとか。
他にはアクションコマンドで分岐する方法もあります。

・メンバ変数の例

public class TestButton extends Applet implements ActionListener {
  Button btn1,btn2,bt3;
  public void init(){
    btn1=new Button("red");
    add(btn1);
    btn2=new Button("blue");
    add(btn2);
    btn3=new Button("yellow");
    add(btn3);
  }
  public void actionPerformed(ActionEvent e){
    Object obj=e.getSource();
    if(obj == btn1){
      // "red"の処理
    }
    else if(obj == btn2){
      // "blue"の処理
    }
    else if(obj == btn3){
      // "yellow"の処理
    }
  }
}

・ラベルで比較する例

public void acitonPerformed(ActionEvent e){
  Object obj=e.getSource();
  if(obj instanceof Button){
    Button btn=(Button)obj;
    String labStr=btn.getLabel();
    if("red".equals(labStr)){
      // "red"の処理
    }
    else if("blue".equals(labStr)){
      // "blue"の処理
    }
    else if("yellow".equals(labStr)){
      // "yellow"の処理
    }
  }
}

・アクションコマンドの例

public void actionPerformed(ActionEvent e){
  String cmdName=e.getActionCommand();
  if("red".equals(cmdName)){
    // "red"の処理
  }
  else if("blue".equals(cmdName)){
    // "blue"の処理
  }
  else if("yellow".equals(cmdName)){
    // "yellow"の処理
  }
}

制約が無ければアクションコマンドでの処理が私は好きです。

これは色々やり方があります。
ボタンをメンバ変数として定義してActionEventの
getSource()メソッドでEventが発生したObjectと
比較するとか、getSource()で取得したオブジェクト
をButtonにキャストしてからgetLabel()でラベルの
文字列を取得し任意の文字列と比較するとか。
他にはアクションコマンドで分岐する方法もあります。

・メンバ変数の例

public class TestButton extends Applet implements ActionListener {
  Button btn1,btn2,bt3;
  public void init(){
    btn1=new Bu...続きを読む

Q動的配列確保

JAVA初心者です。
VBでのRedim Preserve、CのreallocみたいなものはJAVAには無いのでしょうか?
要はあらかじめ配列数がわかっていない時に動的配列確保を行いたいのです。
Objectではなく、基本クラスのint、byte等の配列に使いたいと思っております。
ArrayListが近い事が出来そうだったのですが、Objectにしか使用出来ないので、
断念しました。教えてください。

Aベストアンサー

ラップするというのは、こんな感じです。

byte value = 1;
ArrayList list = new ArrayList();
list.add(new Byte(value));

byte や int に対応する、java.lang.Byte や java.lang.Integer などのクラスを使います。例えば new Byte(3) とやると、3 の byte 値を持つ Byte クラスのオブジェクトができます。あくまでもオブジェクトですので、そのままでは足し算や掛け算はできませんが、ArrayList にオブジェクトとして追加できるようになります。

オブジェクトから元の数値に戻すには、byteValue() や intValue() などのメソッドが各クラスに用意されているのでそれを使います。

もちろん、質問者さんが補足に書いたように、文字列に変換して ArrayList にいれる方法でもかまいません。ただし、Byte や Integer クラスのオブジェクトを使うと、
○「文字列⇔数値」の相互変換の必要が無いので、(一応)速い。
○元の数値が byte だったのか、int だったのか、short だったのか、…… が判別できる。
などの利点があります。

ラップするというのは、こんな感じです。

byte value = 1;
ArrayList list = new ArrayList();
list.add(new Byte(value));

byte や int に対応する、java.lang.Byte や java.lang.Integer などのクラスを使います。例えば new Byte(3) とやると、3 の byte 値を持つ Byte クラスのオブジェクトができます。あくまでもオブジェクトですので、そのままでは足し算や掛け算はできませんが、ArrayList にオブジェクトとして追加できるようになります。

オブジェクトから元の数値に戻すには、byteValue() や...続きを読む

QKeyListenerの使い方について

FrameクラスのフレームにKeyListenerをaddKeyListenerで登録してキー入力を受け付けたいのですが、キーを入力してもまったく反応がありません。どうやらkeyTyped,keyPressed,keyReleasedのどのメソッドも呼び出されてないようです。クラスの概要は以下のとおりです。
class sampleFrame extends Frame implements KeyListener
{
{
addKeyListener(this);//コンストラクタ内で登録
}



で、keyPressedとうのメソッドはすべて定義しています。それから、キーを入力するとなぜか同じフレーム上のリストボックスの項目が入れ替わったりします。
どうぞよろしくお願いいたします。

Aベストアンサー

こんにちは。
おそらくフォーカスの問題だと思います。
フォーカスをフレームに設定してあげれば良いのですが、一度でも内部のコンポーネントに(クリックするなど)フォーカスを設定すると、フォーカスをフレームに再設定する仕掛けを用意しておく必要があります。
- - -
import java.awt.*;
import java.awt.event.*;

public class Test extends KeyAdapter {

Frame frame;
List list;

public static void main(String args[]) {
new Test();
}

public Test() {
list = new List();
list.add("apple");
list.add("orange");
list.add("banana");
list.removeKeyListener(this);

frame = new Frame("Test");
frame.add(list);
frame.setSize(400, 300);
frame.setLocation(100, 100);
frame.addKeyListener(this);
frame.show();
frame.requestFocus(); // フレームにフォーカスを設定
}

public void keyPressed(KeyEvent e) {
System.out.println("key pressed.");
}

}

こんにちは。
おそらくフォーカスの問題だと思います。
フォーカスをフレームに設定してあげれば良いのですが、一度でも内部のコンポーネントに(クリックするなど)フォーカスを設定すると、フォーカスをフレームに再設定する仕掛けを用意しておく必要があります。
- - -
import java.awt.*;
import java.awt.event.*;

public class Test extends KeyAdapter {

Frame frame;
List list;

public static void main(String args[]) {
new Test();
}

public Test() {
list = new List();
list....続きを読む

Q違うクラスからの変数の共有化

一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m

// 共有化させたい変数を持つクラス
// Var.java
public class Var{
 public static int i;

 public Var(int i){ this.i = i; }
 public Var(){}

 public static void getI(){
  return i;
 }
}

//クラス1
//Class1.java
public class Class1{
 Var var = new Var(1);
}

//クラス2
//Class2.java
public class Class2{
 Var var = new Var();

 System.out.println(var.getI());
}

とした場合、Class1を実行し、次にClass2を実行すると、クラス1で定義した変数の値である 1 が戻ってくるようにしたいのですが、上記の方法では、Class2を実行すると結果は 0 になってしまいました。
まだまだ習い始めたばかりでいまいちstaticを使い切れていないと思います・・・

たとえば、PrintStreamクラスの
public static final PrintStream out
というのはどこから参照しても同じ結果なのでそのようなやり方で大丈夫だろうと思ったのですが・・・

このような方法では共有化させることはできないのでしょうか?またできないのでしたらほかのやり方がもしあった場合は教えていただきたいと思います。
どうかお願いします。

一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m

// 共有化させたい変数を持つクラス
// Var.java
public class Var{
 public static int i;

 public Var(int i){ this.i = i; }
 public Var(){}

 public static void getI(){
  return i;
 }
}

//クラス1
//Class1.java
public class Class1{
 Var var...続きを読む

Aベストアンサー

Class1 のインスタンス
Var var = new Var(1);
Class2 のインスタンス
Var var = new Var();
これは、それぞれ別物を指しています(だって、自分で new と書いて新しく生成しているじゃないですか!)。

Class1 で値を入れた static 領域を Class2 で参照するには、

public class Class2{
// Var は大文字(クラス名)
 System.out.println(Var.getI());
}

とします。「クラス名.staticメンバ」という書式です。ただし、共有されるためには同じ Java VM 上実行されることが条件です。

※参考
public Var(int i){ this.i = i; }
この書き方は実行はできますが、意味的には正しくありません。staticメンバ は new しないでアクセスされることが前提なので、
Var.setI(i);
Var.i = 1;
というような書き方が良いと思います(new はしません)。

Class1 のインスタンス
Var var = new Var(1);
Class2 のインスタンス
Var var = new Var();
これは、それぞれ別物を指しています(だって、自分で new と書いて新しく生成しているじゃないですか!)。

Class1 で値を入れた static 領域を Class2 で参照するには、

public class Class2{
// Var は大文字(クラス名)
 System.out.println(Var.getI());
}

とします。「クラス名.staticメンバ」という書式です。ただし、共有されるためには同じ Java VM 上実行されることが条件です。

※...続きを読む

QArrayListを使った多次元配列の作成について

ArrayListで可変長配列を扱っているのですが、
2次元可変長配列を用いる必要が出てきたので、
下記のように変更したのですがうまくいきません。
何が悪いのか教えていただけませんでしょうか?

-----------------------------------------
ArrayList cars=new ArrayList();
cars.add("フェラーリ");
cars.add("ポルシェ");
cars.add("メルセデスベンツ");
for(int i=0;i<cars.size();i++){
 String str=(String)cars.get(i);
 System.out.println(str);}
-----------------------------------------
上記から下記のように変更しました。
-----------------------------------------
ArrayList[] cars=new ArrayList[3];
cars[0].add("フェラーリ");
cars[0].add("ポルシェ");
cars[0].add("メルセデスベンツ");
for(int i=0;i<cars[0].size();i++){
 String str=(String)cars[0].get(i);
 System.out.println(str);}
-----------------------------------------
エラーは「Exception in thread "main" java.lang.NullPointerException」です。
どうやら初期配列が10ではなく3となってしまっているようです。

ArrayListで可変長配列を扱っているのですが、
2次元可変長配列を用いる必要が出てきたので、
下記のように変更したのですがうまくいきません。
何が悪いのか教えていただけませんでしょうか?

-----------------------------------------
ArrayList cars=new ArrayList();
cars.add("フェラーリ");
cars.add("ポルシェ");
cars.add("メルセデスベンツ");
for(int i=0;i<cars.size();i++){
 String str=(String)cars.get(i);
 System.out.println(str);}
---------------------------------------...続きを読む

Aベストアンサー

こんにちは。

>ArrayList[] cars=new ArrayList[3];
はArrayList型のオブジェクトのインスタンス
を格納する箱を3個作成しただけなので、
この時点では、
cars[0] = null
cars[1] = null
cars[2] = null
となっています。ですから、当然
cars[0].add("フェラーリ");
などとやると、NullPointerExceptionが
発生します。これをさけるには、
cars[0] = new ArrayList();
cars[1] = new ArrayList();
cars[2] = new ArrayList();
とする必要があります。

QJava-Swing TextAreaにスクロールバーが表示されない!

複数の参考書、ネット、大学の先生に聞いても解決できないのですが、テキストエリアにスクロールバーが表示されません。
以下が、ポイントと思われるソースの一部です。
import javax.swing.*;
import javax.swing.ScrollPaneConstants;
import javax.swing.JScrollPane;

public class MyClient extends JFrame implements MouseListener,MouseMotionListener,ActionListener {

private Container c;
JTextArea taMain;
JScrollPane scrollPane = new JScrollPane(taMain);

public MyClient() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500,500);
setVisible(true);
c = getContentPane();
c.setLayout(null);

taMain = new JTextArea(20,50);
taMain.setBounds(10,10,150,300);
c.add(taMain);
c.add(scrollPane);
taMain.setEditable(false);





こんな感じです。
間違っている個所が分かりません。
困り果てているので、分かる方がいらっしゃれば教えてください。

複数の参考書、ネット、大学の先生に聞いても解決できないのですが、テキストエリアにスクロールバーが表示されません。
以下が、ポイントと思われるソースの一部です。
import javax.swing.*;
import javax.swing.ScrollPaneConstants;
import javax.swing.JScrollPane;

public class MyClient extends JFrame implements MouseListener,MouseMotionListener,ActionListener {

private Container c;
JTextArea taMain;
JScrollPane scrollPane = new JScrollPane(taMain);

public MyClient() {

...続きを読む

Aベストアンサー

 こんばんは。

 いくつか原因があります。

>c.add(taMain);

1.これは余分です。
 コンテナに追加するのはJScrollPaneだけで十分です。
 現在はこれが見えているので、スクロールペインが見えていません。

>taMain.setBounds(10,10,150,300);

2.位置とサイズを指定するのはJScrollPaneのほうです。
 これだと、taMainのJScrollPaneの中の位置とサイズを決めていることになります。
 また、JScrollPaneのサイズを決めていないのが、サイズが0で見えなくなってしまっています。

 書くとしたらこうだと思います。

taMain = new JTextArea(20,50);
JScrollPane scrollPane = new JScrollPane(taMain);
scrollPane.setBounds(10,10,150,300);
c.add(scrollPane);


人気Q&Aランキング