質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JFrame

JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

Q&A

解決済

2回答

4159閲覧

JFrameの位置とサイズの取得方法

cantama

総合スコア20

JFrame

JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

1グッド

0クリップ

投稿2021/05/01 17:34

前提・実現したいこと

まず、決定ボタンを押すと2つ目のウィンドウが表示されます。
次にメニューバーのゲットボタンを押すと2つ目のウィンドウのRectを取得できるようにしたいです。

どこでウィンドウのgetX(),getY()を実行すればいいんでしょうか?

本来の処理内容は省いてます。

該当のソースコード

import java.awt.event.*; import java.awt.*; import javax.swing.*; public class application { public static void main(String[] args) { mainFrame f=new mainFrame(); f.initialize(); //メインフレーム生成 } } class mainFrame extends JFrame implements MouseListener{ private static final long serialVersionUID = 1L; JMenu menu1; int MAIN_WIDTH=650,MAIN_HEIGHT=180; public void initialize() { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setBounds(screenSize.width/2-MAIN_WIDTH/2,screenSize.height/2-MAIN_HEIGHT/2,MAIN_WIDTH,MAIN_HEIGHT); setVisible(true); setResizable(false); } public mainFrame() { setDefaultCloseOperation(EXIT_ON_CLOSE); menu1=new JMenu("get"); //メニューバーセット menu1.setFont(new Font("MS ゴシック", Font.BOLD, 20)); menu1.addMouseListener(this); this.add(menu1); menubar.add(menu1); getRootPane().setJMenuBar(menubar); mainPanel mp = new mainPanel(); this.add(mp); mp.disp(); } public void mouseClicked(MouseEvent e){ //getボタンを押すとウィンドウ情報取得 if(e.getSource().equals(menu1)) { subFrame f=new subFrame(); f.get(); } } public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} } class subFrame extends JFrame{ private static final long serialVersionUID = 1L; public void subFrame_1(){ //2つ目のウィンドウパラメータのセット setBounds(0,0,900,900); setVisible(true); mainProcess sp = new mainProcess(); add(sp); } public void get(){ try{ /* *ここで2つ目のウィンドウの位置とサイズの取得がしたいです */ }catch(Exception e) {} } } class mainPanel extends JPanel implements ActionListener{ //メインフレームのパネル private static final long serialVersionUID = 1L; private JButton inDis; public void disp(){ inDis=new JButton("決定"); //ボタンセット inDis.setBounds(500, 50, 60, 25); add(inDis); inDis.addActionListener(this); } public void actionPerformed(ActionEvent evt) { subFrame f=new subFrame(); //新しいウィンドウを表示 f.subFrame_1(); } } class mainProcess extends mainPanel{ //色々処理するとこ private static final long serialVersionUID = 1L; mainProcess(){} }
TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2021/05/02 16:38

現状、決定ボタンを押すたびにsubFrameが表示されると思うのですが(複数個出せる)、どのsubFrameのサイズをとればいいんでしょう?
cantama

2021/05/02 17:18

そうですね。 ウィンドウを1つしか生成できないようにするため最初のウィンドウのサイズだけをとります。 今は、コードが記述されていないため故意に押さずテスト中しています。
guest

回答2

0

ベストアンサー

subFrame f=new subFrame();という行が2か所にあります。

この2つのfは別のインスタンスですから、それぞれ別の位置やサイズを持つことになります。

1つしか開かない想定ということなので、シングルトンにしておくのはどうでしょうか?

Java

1import java.awt.event.ActionEvent; 2import java.awt.event.ActionListener; 3import javax.swing.JButton; 4import javax.swing.JFrame; 5import javax.swing.JMenuBar; 6import javax.swing.JPanel; 7 8 9class MainFrame extends JFrame implements ActionListener { 10 public static void main(String[] args) { 11 new MainFrame().setVisible(true); 12 } 13 14 private final JButton menu1; 15 private final int MAIN_WIDTH = 650; 16 private final int MAIN_HEIGHT = 180; 17 18 public MainFrame() { 19 setDefaultCloseOperation(EXIT_ON_CLOSE); 20 setSize(MAIN_WIDTH, MAIN_HEIGHT); 21 setLocationRelativeTo(null); 22 setResizable(false); 23 24 JMenuBar menuBar = new JMenuBar(); 25 menu1 = new JButton("get"); 26 menu1.addActionListener(this); 27 menuBar.add(menu1); 28 setJMenuBar(menuBar); 29 30 MainPanel mp = new MainPanel(); 31 add(mp); 32 } 33 34 @Override public void actionPerformed(ActionEvent e) { 35 if (e.getSource().equals(menu1)) { 36 SubFrame.instance.get(); 37 } 38 } 39} 40 41class MainPanel extends JPanel implements ActionListener { 42 public MainPanel() { 43 JButton inDis = new JButton("決定"); 44 inDis.setBounds(500, 50, 60, 25); 45 inDis.addActionListener(this); 46 add(inDis); 47 } 48 49 @Override public void actionPerformed(ActionEvent e) { 50 // すでにインスタンスはできているのでnewはしない 51 // 閉じても非表示になっているだけなのでまた表示可能 52 // 連続してtrueしても別に平気 53 SubFrame.instance.setVisible(true); 54 } 55} 56 57final class SubFrame extends JFrame { 58 public static final SubFrame instance = new SubFrame(); 59 60 // 外からnewできないようにする 61 private SubFrame() { 62 setBounds(0, 0, 900, 900); 63 64 // デフォルトがHIDE_ON_CLOSE 65 // setDefaultCloseOperation(HIDE_ON_CLOSE); 66 } 67 68 public void get() { 69 if (isVisible()) 70 System.out.println(getBounds()); 71 else 72 System.out.println("開いてません"); 73 } 74}

投稿2021/05/02 17:41

編集2021/05/02 17:57
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cantama

2021/05/04 00:29

回答ありがとうございます。 シングルトンの形も扱いやすく良さそうなのでとても参考になりました。 また、ウィンドウが複数表示されている場合getBoundsをしてもエラーとなりますが、明示的にその片方のJFrameのインスタンスを閉じる方法ってありませんか?
TN8001

2021/05/04 00:51

> ウィンドウが複数表示されている場合getBoundsをしてもエラーとなります えっとどういう状態でしょうか?? cantamaさんの提示コードのどこかにgetBoundsを入れた? エラー内容は何ですか? > 明示的にその片方のJFrameのインスタンスを閉じる方法ってありませんか? ウィンドウを非表示にするなら setVisible(false) とでもすればいいでしょうが、何かそれ以外の意味でおっしゃっていますか?
guest

0

どこでウィンドウのgetX(),getY()を実行すればいいんでしょうか?

必要なときに取得すればいいと思いますけど。
たとえば、Windowが開いたときに取得したいのであれば、WindowListenerを使えばいいとおもいます。

java

1import javax.swing.*; 2import java.awt.*; 3import java.awt.event.*; 4 5public class xxHoge { 6 7 public static class application { 8 public static void main(String[] args) { 9 mainFrame f = new mainFrame(); 10 f.initialize(); //メインフレーム生成 11 } 12 } 13 14 static class mainFrame extends JFrame implements MouseListener { 15 private static final long serialVersionUID = 1L; 16 JMenu menu1; 17 int MAIN_WIDTH = 650, MAIN_HEIGHT = 180; 18 19 public void initialize() { 20 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 21 setBounds(screenSize.width / 2 - MAIN_WIDTH / 2, screenSize.height / 2 - MAIN_HEIGHT / 2, MAIN_WIDTH, MAIN_HEIGHT); 22 setVisible(true); 23 setResizable(false); 24 } 25 26 public mainFrame() { 27 setDefaultCloseOperation(EXIT_ON_CLOSE); 28 menu1 = new JMenu("get"); //メニューバーセット 29 menu1.setFont(new Font("MS ゴシック", Font.BOLD, 20)); 30 menu1.addMouseListener(this); 31 this.add(menu1); 32 // menubar.add(menu1); 33 // getRootPane().setJMenuBar(menubar); 34 35 mainPanel mp = new mainPanel(); 36 this.add(mp); 37 mp.disp(); 38 } 39 40 public void mouseClicked(MouseEvent e) { //getボタンを押すとウィンドウ情報取得 41 if (e.getSource().equals(menu1)) { 42 subFrame f = new subFrame(); 43 f.get(); 44 } 45 } 46 47 public void mousePressed(MouseEvent e) { 48 } 49 50 public void mouseReleased(MouseEvent e) { 51 } 52 53 public void mouseEntered(MouseEvent e) { 54 } 55 56 public void mouseExited(MouseEvent e) { 57 } 58 } 59 60 static class subFrame extends JFrame { 61 private static final long serialVersionUID = 1L; 62 private static int xx = 0; 63 private static int yy = 0; 64 65 public void subFrame_1() { 66 //2つ目のウィンドウパラメータのセット 67 xx += 150; 68 yy += 100; 69 setBounds(xx, yy, 900, 900); 70 setVisible(true); 71 mainProcess sp = new mainProcess(); 72 add(sp); 73 74 addWindowListener(new WindowAdapter() { 75 @Override 76 public void windowOpened(WindowEvent e) { 77 super.windowOpened(e); 78 System.out.println(e.getWindow()); 79 System.out.println(" x :" + e.getWindow().getX()); 80 System.out.println(" y :" + e.getWindow().getY()); 81 System.out.println(" w :" + e.getWindow().getWidth()); 82 System.out.println(" h :" + e.getWindow().getHeight()); 83 } 84 }); 85 } 86 87 public void get() { 88 try { 89 /* 90 *ここで2つ目のウィンドウの位置とサイズの取得がしたいです 91 */ 92 } catch (Exception e) { 93 } 94 } 95 } 96 97 static class mainPanel extends JPanel implements ActionListener { //メインフレームのパネル 98 private static final long serialVersionUID = 1L; 99 private JButton inDis; 100 101 public void disp() { 102 inDis = new JButton("決定"); //ボタンセット 103 inDis.setBounds(500, 50, 60, 25); 104 add(inDis); 105 inDis.addActionListener(this); 106 } 107 108 public void actionPerformed(ActionEvent evt) { 109 subFrame f = new subFrame(); //新しいウィンドウを表示 110 f.subFrame_1(); 111 } 112 } 113 114 static class mainProcess extends mainPanel { //色々処理するとこ 115 private static final long serialVersionUID = 1L; 116 117 mainProcess() { 118 } 119 } 120} 121

投稿2021/05/02 07:36

shiketa

総合スコア4061

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cantama

2021/05/02 16:31

回答ありがとうございます。 mainFrameクラスのところにJMenuBar menubar=new JMenuBar();が抜けてました。 そのメニューバーのgetを押した際に、subFrameのgetメソッドで値を取得したいのですが、MouseListenerだとマウスの座標になってしまいますし、WindowListenerだとウィンドウを移動させた後にボタンを押してしまいますとRectが更新されないのです。 一つ考えたのは、 addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { super.windowOpened(e); ScheduledExecutorService es = Executors.newScheduledThreadPool(2); es.scheduleAtFixedRate(() -> { System.out.println(e.getWindow()); System.out.println(" x :" + e.getWindow().getX()); System.out.println(" y :" + e.getWindow().getY()); System.out.println(" w :" + e.getWindow().getWidth()); System.out.println(" h :" + e.getWindow().getHeight()); }, 1L, 1L, TimeUnit.SECONDS); } }); このウィンドウのRect取得は頻繁に使う機能ではなく、繰り返しながら値の更新をすることはあまり良くなさそうなので、他に方法はありませんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問