Javaのループ中のメモリの動きについて

このQ&Aのポイント
  • Javaのループ中におけるメモリの動きと、メモリが使われすぎる可能性について説明します。
  • 無限ループを含むJavaのプログラムでメモリ使用量を測定する方法についての質問です。
  • テキストフィールドの文字列を置換し、カットする処理を無限ループで行う際にメモリ使用量に懸念があるかどうかについて知りたいです。
回答を見る
  • ベストアンサー

 Javaのループ中のメモリの動きについて

 Javaのループ中のメモリの動きについて  以下のソースはテキストフィールドに文字列を張り付けると、特定の文字を置き換えて、カットするものです。 アクションイベント内で、無限ループをして待ち受ける処理をしていますが、メモリーが使われすぎてパソコンに負担がかかるのではと思っています。     見た目では影響ないようですし、カタカタ音はなりません。  しかし念のため数値でこれを把握したいです。  どのような測定方法があるかご存じの方がおられましたら教えてください。  (また、根本的にプログラムがNGであれば、ご指摘いただきたいです) public class test_1 extends Frame implements ActionListener { public static void main(String[] args) { new test_1(); } JTextField a = new JTextField(); JLabel b = new JLabel("Ctl + C", JLabel.CENTER); JButton b1 = new JButton(); String name; ClosingListener c = new ClosingListener(); public test_1() throws HeadlessException { super(); this.setTitle("日時の/と:を取り除く"); this.setSize(400, 150); this.addWindowListener(c); a.setFont(new Font("", Font.BOLD, 30)); a.setFocusable(true); a.putClientProperty("caretAspectRatio", Float.valueOf(0.3F)); a.setForeground(Color.cyan); a.setBackground(Color.yellow); b.setBackground(Color.white); b.setFont(new Font("", Font.BOLD, 30)); b.setPreferredSize(new Dimension(150, 150)); b1.addActionListener(this); this.add(a, BorderLayout.CENTER); this.add(b, BorderLayout.WEST); this.setVisible(true); b1.doClick(); } class ClosingListener extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } public void actionPerformed(ActionEvent e) { while (true) { if ((a.getText().length() == 15) == true) {//文字の置き換え name = a.getText(); name = name.replaceAll("/", "_"); name = name.replaceAll(":", "_"); // name.substring(0, 16); System.out.println("name==" + name); a.setText(name); a.requestFocusInWindow(); a.selectAll(); a.cut(); } else if (a.getText().equals("")) {//空文字はスルー } else {//15文字以外はエラー JOptionPane.showConfirmDialog(this, "日時は**文字です。", "確認", JOptionPane.DEFAULT_OPTION); a.requestFocusInWindow(); a.selectAll(); a.cut(); } } } }

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

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

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.2

 #1です。 >なんとか待ち受け状態の機能を考えようと >してこうなってしまいました。  気持ちはわかります。  そして、全く的外れというわけでもありません。  事実、C言語でWindowsアプリケーションを一からゴリゴリ書こうと思えば、似たようなことをしなくてはいけません。  しかし、プログラマーがそういうことをしなくていいのが、イベント駆動型プログラミングです。 「スレッドを無限ループで回し、コンポーネントの状態変化を監視し続ける」というアイデアでしょうが、そもそもそれは、イベントディスパッチスレッドのお仕事です。  たとえば、ボタンのActionイベントは、使ったことがあるようなので、それを思い出してみてください。  無限ループの中で、マウスポインタの位置とマウスボタンの状態を常時監視し、JButtonの位置で、マウスボタンが押されたら、JButtonがクリックされたと判断する、なんて、やったでしょうか?  それをするのは、イベントディスパッチスレッドであり、イベントディスパッチスレッドは、条件が合致すると、それに対応したイベントをトリガします。  プログラマーは、それに対応した、イベントリスナーをあらかじめ登録しておけば、よいと言うことです。  さて、今回のことで言えば、JTextField のテキストの変化を監視したいと言うことなので、それに見合ったイベントがあるか、探すべきです。  JTextField はちょっとややこしいのですが、APIドキュメントを読めば、ちゃんと書いてあります。  調べてみてください。

hatokamome
質問者

お礼

重要なヒントをありがとうございます。 意味が理解できました。 さっそくJTextFieldのイベントリスナーを使って書き直します。 いつもアドバイスありがとうございます。

その他の回答 (1)

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんにちは。  コードを一目見て、「これはフリーズして動かないだろう」と思ったのですが、期待通りの動きではないにせよ、動くには動いたので、びっくりしました。  なんかいろいろ創意工夫の後が見られて、何とか動かそうと言う「その意気やよし」とは思いますが、残念ながら根本的に間違っています。  もうすこし、イベント駆動型プログラミングの基礎を勉強しなおしましょう。  でも、まあ、迷走するというのは、悪い事じゃないですよ。  今回のような迷い道に入り込んでから、基礎をやり直せば、イベント駆動のありがたみが身にしみるというものですよ。

hatokamome
質問者

補足

いつもありがとうございます。 なんとか待ち受け状態の機能を考えようとしてこうなってしまいました。 イベントではなくスレッドで起動しなければならないということでしょうか。 イベント駆動型プログラミングはActionListenerやMouseListenerなどよく使うのですが、 イベント駆動のどのような部分の基礎のことなのか解りません。 (スレッドの働きのようなものでしょうか) ヒントを頂けませんでしょうか。 よろしくお願いいたします。

関連するQ&A

  • DocumentListenerについて

    DocumentListenerについて 以下のソースのinsertUpdateメソッド内のsetText()でエラーになります。 actionPerformedの場合はエラーになりませんでした。 ご存じの方がおられましたら教えてください。 public class test_1 extends Frame { public static void main(String[] args) { new test_1().setVisible(true); } String name; JTextField a = new JTextField(); JLabel b = new JLabel("Ctl + C", JLabel.CENTER); JButton b1 = new JButton(); ClosingListener c = new ClosingListener(); public test_1() throws HeadlessException { super(); this.setTitle("日時の/と:を取り除く"); this.setSize(400, 150); this.addWindowListener(c); a.setFont(new Font("", Font.BOLD, 30)); a.setFocusable(true); a.putClientProperty("caretAspectRatio", Float.valueOf(0.3F)); a.setForeground(Color.cyan); a.setBackground(Color.yellow); a.getDocument().addDocumentListener(new MyListener()); b.setBackground(Color.white); b.setFont(new Font("", Font.BOLD, 30)); b.setPreferredSize(new Dimension(150, 150)); this.add(a, BorderLayout.CENTER); this.add(b, BorderLayout.WEST); } class ClosingListener extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } class MyListener implements DocumentListener {//123/123:123 public void changedUpdate(DocumentEvent de) { } public void insertUpdate(DocumentEvent de) { name = a.getText(); name = name.replaceAll("/", "_"); name = name.replaceAll(":", "_"); System.out.println("name==" + name); a.setText(name);//エラー /* Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1323) at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:644) at javax.swing.text.JTextComponent.setText(JTextComponent.java:1693) at test_1$MyListener.insertUpdate(test_1.java:68) */ a.requestFocusInWindow(); a.selectAll(); a.cut();//切り取りはできているが、テキストフィールドの文字列は消えない。 } public void removeUpdate(DocumentEvent de) { } } }

    • ベストアンサー
    • Java
  • javaプログラムのファイル書き出しについて

    以前はファイルに書き出すためのパスが違っており、書き出せずにいるところをアドバイスいただきありがとうございます。 プロフィールを書くプログラムを組んでいます。 打ち込んだプロフィールを画面に表示すると同時に、ファイルにも結果を書き出したいのですが、書き出せれる内容が、打ち込んだ内容ではなく、 プルグラムの書き込み欄に例として表示される用に書いている、 下の内容が書き出されてしまいます。 「name = new JTextField("名前", 20); birth = new JTextField("生年月日", 20); address = new JTextField("住所", 40); mail = new JTextField("mail", 40); number= new JTextField("電話番号", 30);」 テキストファイルに書き出される内容です。 「名前:名前 生年月日:生年月日 住所:住所 mail:mail 電話:電話番号」 打ち込んだ内容がテキストファイルに書き出すにはどうすればいいでしょうか? 下がソースコードです。 よろしくお願いします。 import java.io.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; class Sample extends JFrame implements ActionListener{ /** * */ private static final long serialVersionUID = 1L; static JTextField name; static JTextField birth; static JTextField address; static JTextField mail; static JTextField number; JLabel label; public static void main(String args[]){ Sample frame = new Sample("profile"); frame.setVisible(true); } Sample(String title){ setTitle(title); setBounds(100, 100, 500, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); name = new JTextField("名前", 20); birth = new JTextField("生年月日", 20); address = new JTextField("住所", 40); mail = new JTextField("mail", 40); number= new JTextField("電話番号", 30); JButton button = new JButton("取得"); button.addActionListener(this); label = new JLabel(); p.add(name); p.add(birth); p.add(address); p.add(mail); p.add(number); p.add(button); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); contentPane.add(label, BorderLayout.SOUTH); try{ File file = new File("C:\\Users\\mattun\\Documents\\sample.txt"); if (checkBeforeWritefile(file)){ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); //ファイルに書き込む内容 pw.println("名前:"+name.getText()); pw.println("生年月日:"+birth.getText()); pw.println("住所:"+address.getText()); pw.println("mail:"+mail.getText()); pw.println("電話:"+number.getText()); pw.close();//ファイルを閉じる }else{ System.out.println("ファイルに書き込めません");//書き込み出来ない場合 } }catch(IOException e){ System.out.println(e); } } public void actionPerformed(ActionEvent e){ label.setText("<html>"+"名前:"+name.getText()+"<br>"+"生年月日:"+birth.getText()+"<br>"+"住所:"+address.getText()+ "<br>"+"mail:"+mail.getText()+"<br>"+"電話:"+number.getText()+"</html>"); } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } }

    • ベストアンサー
    • Java
  • Javaのプログラミングで困っています。

    プロフィールを打ち込んで表示するプログラムを書いていました。 プロフィールの打ち込み後に画面に表示するのと同時にテキストファイルに書き出したいと思ったため、書いてみましたが、ファイルに書き込めず知識不足で困っています。 是非教えていただきたく書き込みをさせていただきました。 自分で書いたコードは書きになります。 import java.io.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; class Sample extends JFrame implements ActionListener{ /** * */ private static final long serialVersionUID = 1L; static JTextField name; static JTextField birth; static JTextField address; static JTextField mail; static JTextField number; JLabel label; public static void main(String args[]){ Sample frame = new Sample("profile"); frame.setVisible(true); } Sample(String title){ setTitle(title); setBounds(100, 100, 500, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); name = new JTextField("名前", 20); birth = new JTextField("生年月日", 20); address = new JTextField("住所", 40); mail = new JTextField("mail", 40); number= new JTextField("電話番号", 30); JButton button = new JButton("取得"); button.addActionListener(this); label = new JLabel(); p.add(name); p.add(birth); p.add(address); p.add(mail); p.add(number); p.add(button); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); contentPane.add(label, BorderLayout.SOUTH); try{ File file = new File("C:Users\\mattun\\Documents\\sample.txt"); if (checkBeforeWritefile(file)){ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); //ファイルに書き込む内容 pw.println("名前:"+name.getText()); pw.println("生年月日:"+birth.getText()); pw.println("住所:"+address.getText()); pw.println("mail:"+mail.getText()); pw.println("電話:"+number.getText()); pw.close();//ファイルを閉じる }else{ System.out.println("ファイルに書き込めません");//書き込み出来ない場合 } }catch(IOException e){ System.out.println(e); } } public void actionPerformed(ActionEvent e){ label.setText("<html>"+"名前:"+name.getText()+"<br>"+"生年月日:"+birth.getText()+"<br>"+"住所:"+address.getText()+ "<br>"+"mail:"+mail.getText()+"<br>"+"電話:"+number.getText()+"</html>"); } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } }

    • ベストアンサー
    • Java
  • JAVAプログラミング

    プログラミングについて質問があります 割り勘ソフトを作りたいのですが button1を押したときに int i = Integer.parseInt(kazu.getText()); int e = Integer.parseInt(kane.getText()); int a = e/i; String s = String.valueOf(a); this.an.setText(s); というプログラムを実行したいのですが button1のクリック処理?イベント処理?というのはどのように書けばいいのでしょうか レイアウトは完成しているので ↓に付け足すような形でお願いします プログラミングの質問をするのは初めてなので何かおかしなところや足りないところがあれば教えてください public class jFram { public static void main(String[] args) { JFrame mainFrame = new JFrame("1"); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.setSize(500,500); mainFrame.setResizable(false); mainFrame.setVisible(true); Container cont = mainFrame.getContentPane(); JButton button1 = new JButton("計算"); final JTextField kane = new JTextField(); final JTextField kazu = new JTextField(); JLabel mony = new JLabel("料金"); JLabel ninz = new JLabel("人数"); JLabel an = new JLabel("a"); button1.setLayout(null); cont.add(button1); button1.setBounds(40,380,100,30); button1.setBackground(Color.blue); kane.setLayout(null); cont.add(kane); kane.setBounds(160,340,100,30); kazu.setLayout(null); cont.add(kazu); kazu.setBounds(160,300,100,30); mony.setLayout(null); cont.add(mony); mony.setBounds(40,340,100,30); ninz.setLayout(null); cont.add(ninz); ninz.setBounds(40,300,100,30); an.setLayout(null); cont.add(an); an.setBounds(160,380,100,30); cont.setLayout(null); JPanel a = new JPanel(); a.setLayout(null); mainFrame.setVisible(true); } }

    • ベストアンサー
    • Java
  • javaプログラムについて

    javaのプログラムで入力項目をDBに書き込むというプログラムを作成しているのですが、 コンソール形式だと成功するのですが、テキストボックスなどをおいて、GUI形式でやろうとするとキーイベントの中の変数ににうまく値が参照されません 以下ソース import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingConstants; import java.awt.Container; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Date; class meibo3 extends JFrame implements KeyListener { public static void main(String args[]) { meibo3 frame = new meibo3("タイトル"); frame.setVisible(true); } // private String name; // private String shu; // private int id; // private int su; meibo3(String title) { setTitle(title); setBounds(100, 100, 300, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); p.setLayout(null); JLabel lmeibo = new JLabel("【名簿入力】", SwingConstants.CENTER); lmeibo.setBounds(100, 10, 80, 30); JLabel lgakuno = new JLabel("学生番号", SwingConstants.CENTER); lgakuno.setBounds(30, 40, 80, 30); JLabel lname = new JLabel("氏 名", SwingConstants.CENTER); lname.setBounds(200, 40, 80, 30); JLabel lshu = new JLabel("入力を終了しますか?(Y/N)"); lshu.setBounds(30, 120, 200, 30); JTextField gaku = new JTextField(4); gaku.setBounds(30, 70, 80, 30); JTextField namae = new JTextField(20); namae.setBounds(200, 70, 80, 30); JTextField y = new JTextField(20); y.setBounds(200, 120, 20, 30); y.addKeyListener(this); ; p.add(lmeibo); p.add(lgakuno); p.add(lname); p.add(gaku); p.add(namae); p.add(y); p.add(lshu); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); int id = Integer.valueOf(gaku.getText()).intValue(); String name = namae.getText(); int nsu = namae.getText().length(); String yn =y.getText(); //method(id,name,nsu,yn); } public void keyPressed(KeyEvent ke) { // TODO 自動生成されたメソッド・スタブ if (ke.getKeyCode() == ke.VK_ENTER) { //private void method(int id, String name, int nsu, String yn){ Date d = new Date(); SimpleDateFormat dfd = new SimpleDateFormat("yyyy-MM-dd"); Connection con = null; String day = dfd.format(d); // System.out.print(day); PreparedStatement ps = null; try { // ドライバクラスをロード Class.forName("com.mysql.jdbc.Driver"); // データベースへ接続 con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/hellodb", "root", "root"); Statement stmt = (Statement) con.createStatement(); // name,bloodType,ageのデータを検索するSQL文を作成 String sql = "INSERT INTO hellodb.meibo VALUES(" + id + ",'" + name + "','" + day + "');"; System.out.println(sql); if (id > 4 && nsu > 20) { // JOptionPane.showMessageDialog(this, "学生番号が4桁以上、氏名が20文字以上になっています。", "Error", // JOptionPane.ERROR_MESSAGE); } else { if (id < 5) { // JOptionPane.showMessageDialog(this, // "学生番号が4桁以上になっています", "Error", // JOptionPane.ERROR_MESSAGE); } else { if (nsu > 20) { // JOptionPane.showMessageDialog(this, // "氏名が20文字以上になっています。", "Error", // JOptionPane.ERROR_MESSAGE); } else { if (yn.equals("y") || yn.equals("y") || yn.equals("Y") || yn.equals("Y")) { // ps = con.prepareStatement(sql); stmt.execute(sql); // JOptionPane.showMessageDialog(this, // "成功しました", "Info", // JOptionPane.INFORMATION_MESSAGE); } else if (yn.equals("n") || yn.equals("n") || yn.equals("N") || yn.equals("N")) { } } } } } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { // close処理 if (ps != null) { ps.close(); } // close処理 if (con != null) { con.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } public void keyReleased(KeyEvent arg0) { // TODO 自動生成されたメソッド・スタブ } public void keyTyped(KeyEvent arg0) { // TOD

  • javaアプレットについて質問です

    本の通りにソースを記入し、コンパイラしました。 その後実行したら Exception in thread"main"java.lang.NoSuchMethodError:main とコマンドプロンプトに表示されました。 何が原因ですか? 因みに下記がソースコードです import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Sample13 extends JApplet { private JLabel lb; private JTextField tf; public void init() { //コンポーネントの作成 lb = new JLabel("お選びください。"); tf = new JTextField(); //コンテナへ追加 add(lb, BorderLayout.NORTH); add(tf, BorderLayout.SOUTH); //リスナの登録 tf.addActionListener(new SampleActionListener()); } //リスナクラス class SampleActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { JTextField tmp = (JTextField) e.getSource(); lb.setText(tmp.getText() + "ですね。"); } } }

  • 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()); }

  • java修正

    以下のDentaku.javaのソースコードには引き算と割り算の部分が抜けてしまっているのですが引き算と割り算の部分を付け加えてくれる方お願いします。。(うまく手を加えることができませんでした) // Dentaku.java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Dentaku extends JFrame implements ActionListener { JTextField text1, text2; JButton button1, button2, button3; JLabel label; // コンストラクタ public Dentaku() { // コンテントペインを取得 Container contentPane = getContentPane(); // レイアウトマネージャーを設定 contentPane.setLayout(new GridLayout(6,1)); // テキストフィールド生成 text1 = new JTextField("", 20); text2 = new JTextField("", 20); // テキストフィースドを追加 contentPane.add(text1); contentPane.add(text2); // ボタンを作成 button1 = new JButton("+"); button2 = new JButton("x"); button3 = new JButton("Clear"); // アクションリスナーを登録 button1.addActionListener(this); button2.addActionListener(this); button3.addActionListener(this); // ボタンを追加 contentPane.add(button1); contentPane.add(button2); contentPane.add(button3); // ラベルを生成 label = new JLabel(""); // 文字を真ん中に表示 label.setHorizontalAlignment(JLabel.CENTER); // ラベルを追加 contentPane.add(label); // ウインドウが閉じられたときにアプリケーションを終了するように設定 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // サブコンポーネントの推奨サイズおよびレイアウトに合わせて // この Window をサイズ変更するように設定 pack(); // 表示します setVisible(true); } public static void main(String[] args) { // フレームを作成 Dentaku frame = new Dentaku(); } /** * アクションが発生すると呼び出されます。 */ public void actionPerformed(ActionEvent ae){ // イベントが指定されたボタンで発生した場合 //足し算 if (ae.getSource().equals(button1)) { try{ String tx1=text1.getText(); String tx2=text2.getText(); double d1=Double.parseDouble(tx1); double d2=Double.parseDouble(tx2); String answer=Double.toString(d1+d2); label.setText(answer); }catch (NumberFormatException e) { label.setText("数字を正しく入力してください。"); } } //掛け算 if (ae.getSource().equals(button2)) { try{ String tx1=text1.getText(); String tx2=text2.getText(); double d1=Double.parseDouble(tx1); double d2=Double.parseDouble(tx2); String answer=Double.toString(d1*d2); label.setText(answer); }catch (NumberFormatException e) { label.setText("数字を正しく入力してください。"); } } if (ae.getSource().equals(button3)) { text1.setText(""); text2.setText(""); label.setText(""); } } }

  • 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
  • 画像からヒストグラムを作りたいのですが

    画像からヒストグラムを計算し、それをグラフにしてあらわしたいと思っています。プログラムは以下のようなところまでできており、TextFieldにファイル名を入力し、EnterkeyもしくはOpenを押すと左下にその画像が表示されるところまでできています。 Startを押すと、その画像のRGBヒストグラムを計算し、赤、緑、青各色のグラフを三つ右下に表示したいのですがGraphicsの使い方や、BufferedImageの使い方がわからず四苦八苦しております。ヒストグラムをしては横区間を16としてやりたいと思っております。自分なりにはヒストグラム値を16で割り、その数値をもとにGraphicsオブジェクトに与えてそれをもとに描写するという方向で作成していましたがわたくしには難しく頓挫してしまいました。どうぞよろしくお願いいたします。 /*ここからソース*/ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import javax.imageio.*; import java.io.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Main { public static class ActionB1 implements ActionListener { JTextField input; JLabel pict1; JFrame frame2; public ActionB1(JTextField input0,JLabel pict10,JFrame A0){ input =input0; pict1=pict10; frame2 = A0; } public void actionPerformed(ActionEvent e){ if(getClass().getResource(input.getText())==null){ pict1.setText("file not found!!!"); } else { ImageIcon temp =new ImageIcon(getClass().getResource(input.getText())); pict1.setIcon(temp); } pict1.repaint(); } } public static class ActionB2 implements ActionListener{ JLabel pict2; JTextField input; JFrame frame3; public ActionB2(JTextField input0,JLabel pict20,JFrame A0){ input =input0; pict2=pict20; frame3=A0; } public void actionPerformed(ActionEvent e){ File filename = new File(input.getText()); BufferedImage Image = null; try { Image = ImageIO.read(filename); } catch (IOException e1) { // TODO 自動生成された catch ブロック e1.printStackTrace(); } //ここからわかりません } public static void main(String[] args){ JFrame frame =new JFrame("タイトル"); frame.setSize(600,400); JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); JButton b1 =new JButton("OPEN"),b2=new JButton("START"); JTextField t1 = new JTextField(30); p1.add(t1); p1.add(b1); p1.add(b2); b1.setBounds(350,10,100,20); b2.setBounds(460,10,100,20); t1.setBounds(110,10,230,20); p1.setBounds(20,10,80,20); frame.getContentPane().add(b1); frame.getContentPane().add(b2); frame.getContentPane().add(t1); frame.getContentPane().add(p1); p2.setLayout(new GridLayout(1,2)); JLabel pict1= new JLabel(),pict2= new JLabel(); p2.add(pict1); p2.add(pict2); ActionB1 actB1 = new ActionB1(t1,pict1,frame); ActionB2 actB2 = new ActionB2(t1,pict2,frame); b1.addActionListener(actB1); b2.addActionListener(actB2); t1.addActionListener(actB1); frame.getContentPane().add(p1,BorderLayout.NORTH); frame.getContentPane().add(p2,BorderLayout.CENTER); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }

    • ベストアンサー
    • Java

専門家に質問してみよう