• 締切済み

java swing での質問です。

javaのプログラミングをeclipseでしているのですが swingで行き詰ってしまいました。 タブペインを使いタブパネルを作り、その中にボタンを配置したのですが、 ボタンの位置をsetBoundsで動かすことができませんでした。 他の命令を使わなければならないのでしょうか? プログラミング自体が初心者のため、説明に不備があると思いますが 助けていただけると幸いです。 ひどいプログラミングかと思いますが張らせていただきました package gui; import java.awt.*; import javax.swing.*; public class ReisyokuMenu extends JFrame{ /*serialVersionUID*/ private static final long serialVersionUID=1L; /*コンポーネント作成*/ JButton syokuzaiBtn = new JButton("食材一覧"); JButton syoumiBtn = new JButton("賞味期限順"); JButton bunruiBtn = new JButton("分類"); JButton returnBtn=new JButton("Topへ"); JPanel tabPanel1 = new JPanel(); JPanel tabPanel2 = new JPanel(); JTabbedPane tabbedpane = new JTabbedPane(); public ReisyokuMenu(){ /*Closeボタンでアプリケーションが終了しないように設定*/ setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); /*フレームサイズを変更できないように設定*/ setResizable(false); /*フレームコンテナのインスタンスを生成*/ Container cPane = getContentPane(); /*レイアウトマネジャを利用しない(座標を指定する)*/ cPane.setLayout(null); setLocationRelativeTo(null); setSize(400, 380);//setBoundsはy、x、幅、高さを指定するのでsetLocationRelativeToで位置指定をする為に使用。 setTitle("一人暮らし支援ツール");//アプリケーションタイトルを入れる tabbedpane.addTab("食材を見る", tabPanel1); tabbedpane.addTab("食材を探す", tabPanel2); tabPanel1.add(syokuzaiBtn); tabPanel1.add(syoumiBtn); tabPanel1.add(bunruiBtn); syokuzaiBtn.setLocation(50, 80);//「選択」ボタン syoumiBtn.setBounds(10,10,325,120); bunruiBtn.setBounds(10,270,90,40); tabPanel2.add(new JLabel("食材名:")); tabPanel2.add(new JTextField("", 10)); setContentPane(tabbedpane); } public void setVisible(boolean isVisible){ if(isVisible){ /*フレームの表示位置を指定(x,y)*/ setLocation(200,200); } /*フレームを表示*/ super.setVisible(isVisible); } }

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

みんなの回答

  • zozy
  • ベストアンサー率60% (20/33)
回答No.1

そもそもにエディタでGUI設計するのは一から自分で作れることが前提だと思います。 いい例えではないですが、小学校の算数の授業で児童に電卓使わせて、よくできました!はおかしいですよね? 自分もよくGUIが分からないうちにエディタを使ってしまい、間違いに気付いて勉強しなおすはめになりましたので。 これで半年近くの期間を無駄にしました。 思い通りに配置されないのはレイアウトが設定されてないからです。 自由配置にする場合はグループレイアウトにするしかないですが、記述が列挙型のためソースが複雑になります。 可読性を考えるのなら他のレイアウトを使うべきかもしれません。 とりあえず、質問のソースから配置条件のはっきりしているものだけ配置したものを作ってみました。 ちなみにグループレイアウトです。 import java.awt.BorderLayout; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTabbedPane; public class ReishokuMenu extends JFrame{ JTabbedPane tabbedPane=new JTabbedPane(); JPanel tabPanel1=new JPanel(); JButton syomiButton=new JButton("賞味期限順"); JButton bunruiButton=new JButton("分類"); JPanel tabPanel2=new JPanel(); public ReishokuMenu(){ //これがないと×ボタンを押しても終了しない //質問のソースにはなかったので今後注意しましょう setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); GroupLayout layout1=new GroupLayout(tabPanel1); tabPanel1.setLayout(layout1); //setHorizontalGroup()は水平方向の配置設定 layout1.setHorizontalGroup( //コンポーネント同士で位置合わせを行うグループ layout1.createParallelGroup() //ひとつづつ配置,サイズ設定を行うグループを追加 .addGroup(layout1.createSequentialGroup() //配置ギャップを10に設定 .addContainerGap(10,10) .addGroup(layout1.createParallelGroup() //最小サイズ,推奨サイズ,最大サイズを指定して配置 //GroupLayout.PREFERRED_SIZEはグループレイアウトの推奨サイズ .addComponent(bunruiButton,GroupLayout.PREFERRED_SIZE,90,GroupLayout.PREFERRED_SIZE) .addComponent(syomiButton,GroupLayout.PREFERRED_SIZE,325,GroupLayout.PREFERRED_SIZE))) ); layout1.setVerticalGroup( layout1.createParallelGroup() .addGroup(layout1.createSequentialGroup() .addContainerGap() .addComponent(syomiButton,GroupLayout.PREFERRED_SIZE,120,GroupLayout.PREFERRED_SIZE) .addGap(150,150,150) .addComponent(bunruiButton,GroupLayout.PREFERRED_SIZE,40,GroupLayout.PREFERRED_SIZE) .addContainerGap(0,Short.MAX_VALUE)) ); tabbedPane.addTab("食材を見る", tabPanel1); GroupLayout layout2=new GroupLayout(tabPanel2); tabPanel2.setLayout(layout2); layout2.setHorizontalGroup( layout2.createParallelGroup() .addGap(0,395,Short.MAX_VALUE) ); layout2.setVerticalGroup( layout2.createParallelGroup() .addGap(0,353,Short.MAX_VALUE) ); tabbedPane.addTab("食材を探す", tabPanel2); getContentPane().add(tabbedPane,BorderLayout.CENTER); //配置されたコンポーネントを見てウィンドウのサイズを設定してくれる pack(); } //実行メソッド public static void main(String args[]){ //setVisibleは可視状態にするかのフラグ new ReishokuMenu().setVisible(true); } }

karimerome
質問者

お礼

回答していただきありがとうございます。 教師から言われ作っていたのですが、GUIの学習をすることが先決ですね。 痛感させられる意見でした。 貴重な意見をありがとうございました。 ソースを提示していただき情けないながらも本当に感謝しています。

関連するQ&A

  • JavaのSwingのレイアウト

    Swingを学習中ですが、うまくレイアウトできません。 添付した画像のようなレイアウトにしたいです。 作ってみたものは以下です。 import java.awt.BorderLayout; import java.awt.Color; import javax.swing.*; public class LayoutTest { public static void main(String[] args) { JFrame frame = new JFrame(); JPanel panel = new JPanel(); JTextField searchFiled = new JTextField("テキスト"); String[] comboboxString = {"C", "C++", "Java"}; JComboBox comboBox = new JComboBox(comboboxString); JButton button = new JButton("ボタン"); panel.add(comboBox, BorderLayout.EAST); panel.add(searchFiled, BorderLayout.CENTER); panel.add(button, BorderLayout.WEST); frame.add(panel, BorderLayout.PAGE_START); JPanel redPanel = new JPanel(); redPanel.setBackground(Color.RED); frame.add(redPanel); frame.setSize(700, 500); frame.setLocationRelativeTo(null); frame.setVisible(true); } }

    • ベストアンサー
    • Java
  • swingのJframeについて

    JFrameについて質問があるのですが import javax.swing.*; public class JFrameTest extends JFrame{ public static void main(String[] args){ JFrameTest frame = new JFrameTest(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } JFrameTest(){ JPanel p = new JPanel();   Container contentPane = getContentPane(); ContentPane.add(p);   pack(); } } このプログラムと import javax.swing.*; public class JFrameTest{ public static void main(String[] args){ JFrame frame = new JFrame("フレームのタイトル"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds( 10, 10, 300, 200); frame.setVisible(true); JPanel p = new JPanel();   Container contentPane = frame.getContentPane(); frame.ContentPane.add(p);   frame.pack(); } } このプログラムは何が違うのでしょう? やってることはまったく一緒だと思ってたのですが、全然違うみたいです。 上のプログラムの JFrameTest(){ はコンストラクタと呼ばれるものなのでしょうか? しょぼい質問で申し訳ないのですが誰か教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • Swing自作コンポーネントをadd出来るように、

    JTextFieldやJButtonなどを一つにまとめたコンポーネントを自作し、それをadd()出来るようにしたいです。frame.add(自作のクラスのインスタンス)を可能にしたいです。 調べて、paintComponent()を使えば良いということはわかったのですが、Graphicsのインスタンス(?)に線を描いたり、円を描いたりする方法はわかりましたが、JButtonやJTextFieldなどをGraphicsのインスタンス(?)に追加する方法はわからず、paintComponent()を使うやり方はできませんでした。 paintComponent()も使わずに、自分のできる方法で、組んだものを一応載せます。 import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class MyComponentTest{ public static void main(String[] args){ JFrame frame = new JFrame("タイトル"); frame.setSize(400, 300); frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); // 2つのテキストフィールドと一つのボタンを4つ追加する frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.setVisible(true); } } //2つのテキストフィールドと一つのボタンを一つの部品にしたい class TwoTextFieldsAndOneButton{ JTextField textField1 = new JTextField("テキストフィールド1"); JTextField textField2 = new JTextField("テキストフィールド2"); JButton button = new JButton("ボタン"); // こんなメソッドを使わずに、再現したい JPanel getContent(){ JPanel panel = new JPanel(); panel.add(textField1); panel.add(textField2); panel.add(button); return panel; } }

    • ベストアンサー
    • Java
  • JavaでのSwingを使った簡易電卓作成

    Javaについて勉強中の学生です。 よろしくお願いします。 CGIによるプログラムは一通り勉強しました。 次にGUIによるプログラムを勉強中です。 そこで電卓を作ってみようと思いましたが、よくわからないところがあります。 ご教示いただければ幸いです。 一応外見だけは作ることができましたが、イベントを登録するときに電卓のボタンをbtn1,btn2,btn3…とすればイベントを登録することはできるのですが、それだとボタンの分だけ作成しなければならず修正を加えるのが大変になってしまいます。 例)btn1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ hyozi.setText(hyozi.getText() + "1"); } } そこで「btn」に統一しボタンに表示されている文字列を使い簡潔にプログラムをまとめたいのですがどのようにすればよいのかわかりません。以下のプログラムに追加できるようなものを教えていただけないでしょうか? import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Dentaku{ private JFrame frame; private JPanel panel_fun,panel_ten; private JTextField hyozi; private JButton btn; public Dentaku(){ //フレームの作成してレイアウトをセット frame = new JFrame("簡易電卓プログラム"); frame.setLayout(new BorderLayout()); //パネルを作成してレイアウトをセット panel_fun = new JPanel(); panel_fun.setLayout(new GridLayout(2,3)); panel_ten = new JPanel(); panel_ten.setLayout(new GridLayout(4,3)); //表示用テキストボックスを作成 hyozi = new JTextField(); //電卓のボタンを作成 panel_fun.add(btn = new JButton("CA")); panel_fun.add(btn = new JButton("+")); panel_fun.add(btn = new JButton("-")); panel_fun.add(btn = new JButton("*")); panel_fun.add(btn = new JButton("/")); panel_fun.add(btn = new JButton("=")); panel_ten.add(btn = new JButton("1")); panel_ten.add(btn = new JButton("2")); panel_ten.add(btn = new JButton("3")); panel_ten.add(btn = new JButton("4")); panel_ten.add(btn = new JButton("5")); panel_ten.add(btn = new JButton("6")); panel_ten.add(btn = new JButton("7")); panel_ten.add(btn = new JButton("8")); panel_ten.add(btn = new JButton("9")); panel_ten.add(btn = new JButton("0")); //フレームに表示用テキストボックスをセット(BorderLayoutの北側) frame.add(hyozi,BorderLayout.NORTH); //フレームにパネルをセット(BorderLayoutの中央,南側) frame.add(panel_fun,BorderLayout.CENTER); frame.add(panel_ten,BorderLayout.SOUTH); //フレームの詳細設定 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300,250); frame.setVisible(true); } //mainメソッドの定義 public static void main(String[] args){ Dentaku application = new Dentaku(); } }

    • ベストアンサー
    • Java
  • Jave Swing 画像表示わからない

    java swingでGUIをプログラミングしている者です。 JLabelにImageIconの画像を貼り付けるプログラムです。↓ //画像を表示するプログラム //インポート import javax.swing.*; import java.awt.*; import java.awt.event.*; class gazopro extends JFrame{ JLabel l1; JButton b1; JPanel p; public static void main(String args[]) { //ウィンドウを作成また設定 gazopro frame = new gazopro(); frame.setBounds(300,200,700,400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } gazopro(){ //コンポーネントを作成 p = new JPanel(); add(p); b1 = new JButton("画像を表示"); p.add(b1); ImageIcon icon = new ImageIcon("image.jpg"); l1 = new JLabel(icon); p.add(l1); } }   わからないところは、ImageIcon icon = new ImageIcon("image.jpg");のところです。 ImageIconの引数は、プログラミングを行っているパソコン(OS は Windows)のマイコンピューター→ Cドライブ→ MyJava→ image.jpgを指定しましたがこれで合ってますか? このプログラムでは、画像が表示されませんでした。 どうすればいいでしょうか? 解説と、ご指導宜しくお願いします。

    • ベストアンサー
    • Java
  • java applet 上段に2×3、下段に1×3のボタンを作る

    タイトルのようなアプレットを作りたいのですがなぜか実行されません。どこがおかしいのでしょうか? (文字数制限のため省略) { private JButton bt[] = new JButton[9]; private JPanel pn[] = new JPanel[2]; int i; public void init() { Container cnt = getContentPane(); for(i=0; i<9; i++){ add(bt[i] = new JButton("")); } pn[0] = new JPanel(); pn[1] = new JPanel(); //上パネルに置くボタン6つ bt[0].setSize(80,80); bt[0].setLocation(0,0); bt[1].setSize(80,80); bt[1].setLocation(80,0); bt[2].setSize(80,80); bt[2].setLocation(160,0); bt[3].setSize(80,80); bt[3].setLocation(0,80); bt[4].setSize(80,80); bt[4].setLocation(80,80); bt[5].setSize(80,80); bt[5].setLocation(160,80); //下パネルに置くボタン3つ bt[6].setSize(80,80); bt[6].setLocation(0,200); bt[7].setSize(80,80); bt[7].setLocation(80,200); bt[8].setSize(80,80); bt[8].setLocation(160,200); //上パネルと下パネルの作成 pn[0].setLocation(0,0); pn[1].setLocation(0,200); //ボタンをパネルに付ける pn[0].add(bt[0]); pn[0].add(bt[1]); pn[0].add(bt[2]); pn[0].add(bt[3]); pn[0].add(bt[4]); pn[0].add(bt[5]); pn[1].add(bt[6]); pn[1].add(bt[7]); pn[1].add(bt[8]); //コンテナへ追加 cnt.add(pn[0]); cnt.add(pn[1]); } } 座標を指定してボタンを設置する方法にしたいと思っています。 ちなみに完成図はこのような感じにしたいです。 ↓ □□□ □□□ □□□

    • ベストアンサー
    • Java
  • javaのBoxlayoutについて

    下記はBoxLayout用ののコードです。 Q1)Buttonのサイズを設定する方法がありますか? Q2)Buttonの配置を設定する方法がありますか? //===================================== import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.LayoutManager; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class AlignmentX extends JFrame{ JButton button1; JButton button2; JButton button3; public static void main(String[] args){ AlignmentX frame = new AlignmentX(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("タイトル"); frame.setVisible(true); } AlignmentX(){ button1 = new JButton("AAAAA"); button1.setAlignmentY(0.5f); button1.setPreferredSize(new Dimension(80,20)); button2 = new JButton("BBB"); button2.setAlignmentY(0.5f); button2.setPreferredSize(new Dimension(80,20)); button3 = new JButton("CC"); button3.setAlignmentY(0.5f); button3.setPreferredSize(new Dimension(80,20)); JPanel p = new JPanel(); p.setLayout((LayoutManager) new BoxLayout(p, BoxLayout.Y_AXIS)); p.add(button1); p.add(button2); p.add(button3); getContentPane().add(p, BorderLayout.CENTER); setBounds(10, 10, 300, 200); } } //以上,宜しくお願いします。

    • ベストアンサー
    • Java
  • javaアプリのswingに関する質問です

    始めて投稿させていただきます。 現在、javaアプリケーションのswingを利用し、ボタンを押したら画像が表示され、ウエイトの時間を過ぎると自動的に画像が消え、またボタンが表示され・・・を繰り返すプログラムを作っています。 ですが、色々なサイトを拝見させていただき、修正を加えたのですが思うように動いてくれません。 そこで、皆様のお知恵を拝借出来ればと思い投稿させていただきました。 下記にソースコードを記載しております。 すべてのソースコードを記載しておりますので長くなっております。 また最終的には、50個前後のボタン、画像の拡大等を行う予定です。 長文になりますがアドバイスをいただけましたら幸いです。 -----------以下ソースコード-------------------- import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.imageio.*; class Test extends JPanel implements ActionListener{ static JFrame frame = new JFrame(); JButton bt1; JButton bt2; JPanel pn1 = new JPanel(); Dimension dim = this.getToolkit().getScreenSize(); int eventNo = -1; public Test() { frame.setTitle("これ"); frame.setUndecorated(true); frame.setBounds(0, 0, 640, 480); btStart(); pn1.setLayout(new FlowLayout()); frame.add(pn1); frame.setVisible(true); } public void btStart(){ bt1 = new JButton("テスト"); bt2 = new JButton("終了"); pn1.add(bt1); pn1.add(bt2); bt1.addActionListener(this); bt2.addActionListener(this); } // ボタン消去メソッド public void btFormat(){ frame.remove(pn1); bt1 = null; bt2 = null; } public void actionPerformed(ActionEvent e){ if(e.getActionCommand() == "テスト") {eventNo = 1;} if(e.getActionCommand() == "終了") {eventNo = 46;} repaint(); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; if(eventNo == 46){ System.exit(0); }else if(eventNo == -1){ g2.clearRect(0, 0, 640, 480); }else if(eventNo >= 0){ eventNo = -1; btFormat(); try{ g2.drawImage(ImageIO.read(new File("./image/001.jpg")), 0, 0, this); frame.add(this); sleep(100); g2.clearRect(0, 0, 640, 480); btStart(); pn1.setLayout(new FlowLayout()); frame.add(pn1); }catch(Exception e){ System.out.println(e); } } } // ウェイトを掛けるメソッド public synchronized void sleep(long msec) { for(int i=0; i<=msec; i++){ try { wait(1); } catch(InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.getContentPane().add( new Test() ); } }

    • ベストアンサー
    • Java
  • ボーダー上か否かの判定について

    いつもお世話になってます。 またお願いします。 画面上にパネルを配置して パネルに外枠を設定します。 その内部にボタンを2つ配置しました。 この設定した外枠をドラッグ&ドロップすることで パネル(外枠)のサイズを変更し、 外枠以外のパネル部分をドラッグ&ドロップすることで ボタンや外枠含むを含むパネル全体の移動を行いたいのです。 ★のところで枠上か否かを判定させれば良いのでしょうか? それとも他に方法がありますでしょうか? 宜しくお願いいたします。 public class SampleButtonSize extends JFrame { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private JPanel jPanel = null; private JButton jButton = null; private JButton jButton1 = null; public Point pMus; private JPanel getJPanel() { if (jPanel == null) { jPanel = new JPanel(); jPanel.setLayout(null); jPanel.setBounds(new Rectangle(30, 25, 205, 98)); jPanel.setBorder(new TitledBorder( new EtchedBorder(), "Power" )); jPanel.add(getJButton(), null); jPanel.add(getJButton1(), null); jPanel.addMouseMotionListener(new java.awt.event.MouseMotionListener() { public void mouseDragged(java.awt.event.MouseEvent e) { if( ★ ) { // 枠 pMus = jPanel.getLocation(); jPanel.setLocation(pMus.x + e.getX(), pMus.y + e.getY() ); } else { // 枠以外 jPanel.setSize(e.getX(), e.getY() ); } } public void mouseMoved(java.awt.event.MouseEvent e) { } }); } return jPanel; } private JButton getJButton() { if (jButton == null) { jButton = new JButton(); jButton.setBounds(new Rectangle(16, 25, 82, 58)); } return jButton; } private JButton getJButton1() { if (jButton1 == null) { jButton1 = new JButton(); jButton1.setBounds(new Rectangle(115, 24, 77, 59)); } return jButton1; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { SampleButtonSize thisClass = new SampleButtonSize(); thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); thisClass.setVisible(true); } }); } public SampleButtonSize() { super(); initialize(); } private void initialize() { this.setSize(300, 200); this.setContentPane(getJContentPane()); this.setTitle("JFrame"); } private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout(null); jContentPane.add(getJPanel(), null); } return jContentPane; } }

    • ベストアンサー
    • Java
  • SwingでgetContentPaneのエラーです、お願いします

     今晩は、java勉強中のものです、宜しくお願いします。  下のようなプログラムを組んでみましたが、「型JFrameから非staticメソッドgetContentPane()にstatic参照 することは出来ません」というエラーコードです。  原因が良く分かりません、どなたか教えて下さい。  いくら考えても原因がよく分かりません、宜しくお願いします。 ================================================================ public class Panel_train extends JFrame{ public static void main(String[] args) { Container cnt = getContentPane(); JPanel jpanel = new JPanel(); JTextArea jtext = new JTextArea("Hello World", 100, 50); jpanel.add(jtext); cnt.add(jpanel, BorderLayout.CENTER); JFrame frame = new JFrame("テスト"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 100); frame.setVisible(true); } }

    • ベストアンサー
    • Java