マウスイベントに合わせた動作を行いたい。

このQ&Aのポイント
  • マウスイベントに合わせた動作を行いたい。
  • 枠上か否かの判別はできるようになったが、動作が不安定であり、意図した動作にならず困っている。
  • 枠上だと判定した場合にはボーダーサイズを変更し、枠の内部と判定した場合にはボーダーを含んだパネルをドラッグの動きに合わせて移動したい。どこを修正すればいいのかわからない。
回答を見る
  • ベストアンサー

マウスイベントに合わせた動作を行いたい。

いつもお世話になってます。 再びお願いします。 枠上か否かの判別はできるようになったのですが 動作が不安定というか意図し動作にならず困っております。 悩み疲れてよく分からなくなってきました(汗) 枠上だと判定した場合にはボーダーサイズを変更して、 枠の内部と判定した場合にはボーダーを含んだパネルを ドラッグの動きに合わせて移動したいのです。 どなたかどこを直せば良いのか分かりますでしょうか。 宜しくお願いいたします。 public class SampleButtonSize extends JFrame { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private JPanel jPanel = null; private Border jBdrPower = 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) { MusX = e.getX(); MusY = e.getY(); inner = jBdrPower.getBorderInsets(jPanel); Dimension PnlSize = jPanel.getSize(); pMus = jPanel.getLocation(); if( MusX< inner.left || MusX> PnlSize.width - inner.right || MusY< inner.top || MusY> PnlSize.height - inner.bottom ) { // border の内側線よりも外:サイズ変更 jPanel.setSize(MusX, MusY); } else { // border の内側線よりも内:移動 jPanel.setLocation( pMus.x + MusX, pMus.y + MusY ); } } 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
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

> 全角スペースは使用してないので おっとっと、それは私の投稿のことです。 行のインデント(段下げ)のために全角スペースを利用しています。

Zepetto
質問者

お礼

本題に戻りまして 協力ありがとうございました。 一部を参考にさせていただいて補足欄のようになりました。 コントロール名はちょっと変更しちゃってます。 パネルの四隅の部分の場合のコードは追加が必要ですが。 あと仰られた通り、インセットの範囲が狭いので モードを持たせるかインセットの範囲を広くする(出来る?)かで 対応したいと思っています。 ありがとうございました。

Zepetto
質問者

補足

全角スペースの件、了解しました。 jPnlPower.addMouseMotionListener(new java.awt.event.MouseMotionListener() {  public void mouseDragged(java.awt.event.MouseEvent e) {   newX = e.getX();   newY = e.getY();   dX = newX - oldX;   dY = newY - oldY;   inner = jBdrPower.getBorderInsets(jPnlPower);   pBounds = jPnlPower.getBounds();   int xL = pBounds.x;   int xW = pBounds.width;   int yT = pBounds.y;   int yH = pBounds.height;   if( newX < inner.left )   { // Left Line Risize    jPnlPower.setBounds(new Rectangle( xL + dX, yT, xW - dX, yH ));    jBtnPowerOn.setBounds(new Rectangle(15, 20, ((xW-dX)-40)/2, yH-40));    jBtnPowerOff.setBounds(new Rectangle(((xW-dX)-40)/2+25, 20, ((xW-dX)-40)/2, yH-40));   }   else if( newX > xW - inner.right )   { // Right Line Risize    jPnlPower.setSize(newX, yH);    jBtnPowerOn.setBounds(new Rectangle(15, 20, (newX-40)/2, yH-40));    jBtnPowerOff.setBounds(new Rectangle((newX-40)/2+25, 20, (newX-40)/2, yH-40));   }   else if( newY < inner.top )   { // Top Line Risize    jPnlPower.setBounds(new Rectangle( xL, yT + dY, xW, yH - dY ));    jBtnPowerOn.setBounds(new Rectangle(15, 20, (xW-40)/2, (yH-dY)-40));    jBtnPowerOff.setBounds(new Rectangle((xW-40)/2+25, 20, (xW-40)/2, (yH-dY)-40));   }   else if( newY > yH - inner.bottom )   { // Bottom Line Risize    jPnlPower.setSize(xW, newY);    jBtnPowerOn.setBounds(new Rectangle(15, 20, (xW-40)/2, newY-40));    jBtnPowerOff.setBounds(new Rectangle((xW-40)/2+25, 20, (xW-40)/2, newY-40));   }   else{ // border の内側線よりも内:移動    jPnlPower.setLocation(xL + dX, yT + dY);   }  }  public void mouseMoved(java.awt.event.MouseEvent e) {  } }); jPnlPower.addMouseListener(new java.awt.event.MouseListener() {  public void mouseClicked(java.awt.event.MouseEvent e) {}  public void mouseEntered(java.awt.event.MouseEvent e) {}  public void mouseExited(java.awt.event.MouseEvent e) {}  public void mousePressed(java.awt.event.MouseEvent e) {   oldX = newX = e.getX();   oldY = newY = e.getY();  }  public void mouseReleased(java.awt.event.MouseEvent e) {} });

その他の回答 (2)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.3

> if( newX < inner.left ) > else if( newX > xW - inner.right ) > else if( newY < inner.top ) > else if( newY > yH - inner.bottom ) ここらは、間違いですよ。これらの比較式の左辺は座標値ですが、右辺は座標値ではありません。 mouseDragged()の冒頭で、oldX, oldYを更新してください。

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

これはまだ、100%完成ではないようですが、まあ、ここらあたりを参考にしてください。(非常に細いInsetsの中をmouseDragged()で判断するのが無理なよう。サイズ変更はmousePressed()のときの位置--BorderのInsetsの中か?--で決定したほうが、確実にできると思います。現状では、サイズ変更は、できる場合とできない場合があります…マウスの微妙な動きの違いで。) --------------------------------------------------- 全角スペースを半角スペース2個に変えてください: import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.awt.event.*; public class SampleButtonSize extends JFrame {  private static final long serialVersionUID = 1L;  private JPanel jContentPane = null;  private JPanel jPanel = null;  private TitledBorder jBdrPower = null;  private JButton jButton = null;  private JButton jButton1 = null;  Insets inner;  Rectangle pBounds;  int oldX, oldY, newX, newY, dX, dY, newBx, newBy, newBw, newBh;  private JPanel getJPanel() {   if (jPanel == null) {    jPanel = new JPanel();    jPanel.setLayout(null);    jPanel.setBounds(new Rectangle(30, 25, 205, 98));    jBdrPower = new TitledBorder(new EtchedBorder(), "Power");    jPanel.setBorder(jBdrPower);    jPanel.add(getJButton(), null);    jPanel.add(getJButton1(), null);    jPanel.addMouseMotionListener(new MouseMotionListener() {     public void mouseDragged(java.awt.event.MouseEvent e) {      oldX = newX; oldY = newY;      newX = e.getX();      newY = e.getY();      dX = newX - oldX;      dY = newY - oldY;      pBounds = jPanel.getBounds();      int xL = pBounds.x;      int xW = pBounds.width;      int yT = pBounds.y;      int yH = pBounds.height;      Rectangle pInner = jBdrPower.getInteriorRectangle       (jPanel, pBounds.x, pBounds.y, pBounds.width, pBounds.height);      if (newX < pInner.x       || newX > (pInner.x + pInner.width)       || newY < pInner.y       || newY > (pInner.y + pInner.height)){       newBx = (newX < pInner.x) ? newX : xL;       newBy = (newY < pInner.y) ? newY : yT;       newBw = (newX > (pInner.x + pInner.width)) ? newX - xL : xW;       newBh = (newY > (pInner.y + pInner.height)) ? newY - yT : yH;        // border の内側線よりも外:サイズ変更       jPanel.setBounds(newBx, newBy, newBw, newBh);      }      else{ // border の内側線よりも内:移動       jPanel.setLocation(xL + dX, yT + dY);      } //     jPanel.revalidate(); // 要らないみたい     }     public void mouseMoved(java.awt.event.MouseEvent e) {     }    });    jPanel.addMouseListener(new MouseAdapter(){     public void mousePressed(MouseEvent e){      oldX = newX = e.getX();      oldY = newY = e.getY();     }    });   } // if (jPanel == null)   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;  } } ---------------------------------------

Zepetto
質問者

補足

ありがとうございます。 今から調べて実装してみます。 全角スペースは使用してないので タブを半角スペースにしたらいいのかな? 次回から気をつけます(汗)

関連するQ&A

  • ボーダー上か否かの判定について

    いつもお世話になってます。 またお願いします。 画面上にパネルを配置して パネルに外枠を設定します。 その内部にボタンを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
  • jFrameを使って複数の画面を生成するにはどうすれば良いのでしょうか?

    eclipseのVE機能を使ってjFrameの画面生成を勉強しているのですが、 複数の画面を生成することができません。。 以下のソースで、ボタンが押された時に新しく画面を生成するように しているのですが、なぜか生成できません。エラーもありません。 何が足りなかったのか、悪かったのかを指摘していただけますでしょうか? import javax.swing.JPanel; import javax.swing.JFrame; import java.awt.GridBagLayout; import javax.swing.JButton; import java.awt.GridBagConstraints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class jFrameTest extends JFrame implements ActionListener{ private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private JButton jButton = null; /** * This is the default constructor */ public jFrameTest() { super(); initialize(); } /** * This method initializes this * * @return void */ private void initialize() { this.setSize(300, 200); this.setContentPane(getJContentPane()); this.setTitle("JFrame"); } /** * This method initializes jContentPane * * @return javax.swing.JPanel */ private JPanel getJContentPane() { if (jContentPane == null) { GridBagConstraints gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; jContentPane = new JPanel(); jContentPane.setLayout(new GridBagLayout()); jContentPane.add(getJButton(), gridBagConstraints); } return jContentPane; } /** * This method initializes jButton * * @return javax.swing.JButton */ private JButton getJButton() { if (jButton == null) { jButton = new JButton(); jButton.setText("jButton"); jButton.addActionListener(this); } return jButton; } //ボタン入力リスナー public void actionPerformed(ActionEvent event) { String cmd = event.getActionCommand(); if(cmd == "jButton"){ jFrameTest jtest = new jFrameTest(); System.out.println("new"); } } }

    • ベストアンサー
    • Java
  • ボタンがマウスオーバーしないと表示されない

    java初心者です。 やりたいことは、 i_step変数によって、表示する、画像や、パネル(ボタンが作成されています)を替えたいのです。 今はB_Nextボタンによってi_step変数が加算されます。 i_step=1になると、画像が表示されるのですが、 一緒に表示されてほしい【ボタン1】が表示されません。 ですが、マウスアップすると、表示されるようになります。 はじめは【NEXT】ボタンも表示されなかったのですが、 過去の質問を検索し、 http://oshiete1.goo.ne.jp/qa2530138.html を参照して、super.paint(g);を追加したら、 【NEXT】ボタンは表示されるようになりました。 ソースは以下です。 package guidance_ap; import java.awt.*; import javax.swing.*; public class Test extends JApplet { Image img1, img2; private JButton B_Next = null; private JPanel jContentPane = null; private JPanel jPanel1 = null; private JButton b1 = null; int i_step = 0; public Test() { super(); } public void init() { this.setSize(640, 480); this.setContentPane(getJContentPane()); img1 = getImage(getCodeBase(), "test.gif"); img2 = getImage(getCodeBase(), "test2.gif"); } public void paint(Graphics g) { super.paint(g); jContentPane.removeAll(); jContentPane.add(getB_Next(), null); switch (i_step) { case 0: g.drawImage(img1, 0, 0, this); break; case 1: g.drawImage(img2, 0, 0, this); jContentPane.add(getJPanel1(), null); break; } } private JPanel getJContentPane() { if (jContentPane == null) { try { jContentPane = new JPanel(); jContentPane.setLayout(null); jContentPane.setOpaque(false); } catch (java.lang.Throwable e) { e.printStackTrace(); } } return jContentPane; } private JButton getB_Next() { if (B_Next == null) { try { B_Next = new JButton(); B_Next.setText("NEXT"); B_Next.setLocation(new Point(559, 0)); B_Next.setSize(new Dimension(80, 40)); B_Next.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { i_step++; repaint(); } }); } catch (java.lang.Throwable e) { e.printStackTrace(); } } return B_Next; } private JPanel getJPanel1() { if (jPanel1 == null) { try { jPanel1 = new JPanel(); jPanel1.setOpaque(false); jPanel1.setLayout(null); jPanel1.setSize(new Dimension(640, 480)); jPanel1.setLocation(new Point(0, 0)); jPanel1.setPreferredSize(null); jPanel1.add(getb1(), null); } catch (java.lang.Throwable e) { e.printStackTrace(); } } return jPanel1; } private JButton getb1() { if (b1 == null) { try { b1 = new JButton(); b1.setSize(new Dimension(190, 40)); b1.setText("ボタン1"); b1.setLocation(new Point(90, 400)); b1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed( java.awt.event.ActionEvent e) { } }); } catch (java.lang.Throwable e) { e.printStackTrace(); } } return b1; } } ちなみに【ボタン1】は画像と重なる位置にあります。 super.paint(g);を paintの最後に記述すると、ボタンは表示されますが、 画像が一瞬でて消えてしまいます。 何がいけないのでしょうか?

    • ベストアンサー
    • Java
  • javaでストップウォッチが上手く作れません

    あるサイトを参考にして作ってみたんですが うまく動いてくれません、多分おかしいところだらけですが どこがダメか教えてもらえるとありがたいです package timeP; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; public class timeC extends JFrame implements Runnable { private JPanel contentPane; private JTextField textField; private Thread th = null; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { timeC frame = new timeC(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public timeC() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 85); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS)); JPanel panel_3 = new JPanel(); contentPane.add(panel_3); panel_3.setLayout(new BorderLayout(0, 0)); textField = new JTextField(); panel_3.add(textField, BorderLayout.CENTER); textField.setColumns(10); JPanel panel_2 = new JPanel(); contentPane.add(panel_2); panel_2.setLayout(new BorderLayout(0, 0)); JButton JButtonstart = new JButton(" 開始 "); JButtonstart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if ( th == null ) { th = new Thread ( ); th.start(); } } }); panel_2.add(JButtonstart, BorderLayout.CENTER); JPanel panel_1 = new JPanel(); contentPane.add(panel_1); panel_1.setLayout(new BorderLayout(0, 0)); JButton JButtonstop = new JButton(" 停止 "); JButtonstop.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if ( th != null ){ th = null; } } }); panel_1.add(JButtonstop, BorderLayout.CENTER); JPanel panel = new JPanel(); contentPane.add(panel); panel.setLayout(new BorderLayout(0, 0)); JButton btnNewButton_2 = new JButton("New button"); panel.add(btnNewButton_2, BorderLayout.CENTER); } @Override public void run() { //TODO 自動生成されたメソッド・スタブ int i; while ( th != null ){ i = Integer.parseInt( textField.getText() ); try { Thread.sleep(10000); if ( th == null ) break; } catch ( InterruptedException e ){ break; } textField.setText( Integer.toString( i + 1 ) ); } } }

  • スクロールバー

    Javaを始めたばかりの者です。 すごく基本的な質問をさせて頂きます。 恥ずかしいのですが、スクロールバーを付けようとしても付けることができませんでした。 以下がそのプログラムですが、どうすればよいか正直わかりません。よければ教えて下さい。 import java.awt.*; import javax.swing.*; public class ScrolTest { public JPanel panel =new JPanel(); public static void main (String[] argv) { JFrame frame =new JFrame("てすとー"); frame.setSize(50000,6000); Scrollbar scrollbar = new Scrollbar(); frame.add(scrollbar, null); scrollbar.setBounds(new Rectangle(220, 15, 15, 180)); frame.show(); } }

  • javaのJTextFieldにマウスフォーカス

    お世話になります。 Q1)下記のコードに於きまして、JTextFieldにマウスフォーカス が当りますと、その旨、System.out.println("JTextField_tt")と表示する方法をお教えください。 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.LineBorder; public class EObjectTest extends JFrame implements ActionListener { public static JButton b1; public static JButton b2; public static JTextField tt; static EObjectTest frame; public static void main(String args[]){ frame=new EObjectTest("AAAA"); frame.setVisible(true); } EObjectTest(String title) { setTitle(title); setBounds(100, 100, 300, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); // ボタン作成・追加 b1 = new JButton("One"); b2 = new JButton("Two"); tt = new JTextField("aaa"); LineBorder border = new LineBorder(Color.RED, 2, true); tt.setBorder(border); tt.setColumns(15); p.add(b1); p.add(b2); p.add(tt); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); // リスナ登録 b1.addActionListener(this); b2.addActionListener(this); tt.addActionListener(this); } public void actionPerformed(ActionEvent e) { // getSource() でイベントソースのオブジェクトを獲得し // Button クラスにキャストする JButton b = (JButton)e.getSource(); // JTextField ttt = (JTextField)e.getSource(); if (b==b1) { System.out.println("Oneのボタン"); } if (b==b2) { System.out.println("Twoのボタン"); } /* if (ttt==tt) { System.out.println("JTextField_tt"); } */ } } 以上

    • ベストアンサー
    • Java
  • 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); } }

  • GridBagLayoutについての質問

    ウィンドウ上のjContentPane上にJPanelを配置し、レイアウトをGridBagLayoutにしてそのJPanel上にJTextFieldを置くとそのJTextFieldの幅がほぼ0になります。下記のプログラムがその一部です。gridBagConstraints2.fill をnullにしたままJTextFieldの幅を広げたいのですがどうしたらいいでしょうか?教えてください。 private JPanel getJPanel() { if (jPanel == null) { GridBagConstraints gridBagConstraints2 = new GridBagConstraints(); jPanel = new JPanel(); jPanel.setLayout(new GridBagLayout()); jPanel.setPreferredSize(new java.awt.Dimension(200,150)); gridBagConstraints2.gridx = 0; gridBagConstraints2.gridy = 0; gridBagConstraints2.weightx = 1.0; gridBagConstraints2.fill = java.awt.GridBagConstraints.NONE; gridBagConstraints2.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints2.gridwidth = 4; jPanel.add(getJTextField(), gridBagConstraints2); } return jPanel; } private JTextField getJTextField() { if (jTextField == null) { jTextField = new JTextField(); jTextField.setColumns(32); } return jTextField; }

    • ベストアンサー
    • Java
  • 進捗バーが更新されません。

    プログレスバーの更新についてですが 下記のサンプルで動作させても プログレスバーの進捗状況が更新されなくて困っています。 タイマーなどを使用すれば更新されるようですが 各種状況に応じて自ら更新させたいのです。 以下のサンプルはどのように修正すれば 更新されるようになるでしょうか? 宜しくお願いします。 public class SampleProgressBar extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; JButton startButton; JButton stopButton; JProgressBar bar; JLabel label; int count; public void actionPerformed(ActionEvent arg0) { String cmd = arg0.getActionCommand(); if (cmd.equals("start")){ startButton.setEnabled(false); stopButton.setEnabled(true); for(int i=0, count=0; i<20000; i++ ) { label.setText(count + " count"); count++; bar.setValue(count); int per = (int)(bar.getPercentComplete() * 100); bar.setString(per + "% 完了"); try { Thread.sleep(1); } catch(Exception err) {} } }else if (cmd.equals("stop")){ startButton.setEnabled(true); stopButton.setEnabled(false); bar.setValue(0); int per = (int)(bar.getPercentComplete() * 100); bar.setString(per + "% 完了"); } } public static void main(String[] args) { SampleProgressBar frame = new SampleProgressBar(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("Sample"); frame.setVisible(true); } public SampleProgressBar() { super(); initialize(); } private void initialize() { this.setSize(300, 200); this.setContentPane(getJContentPane()); this.setTitle("JFrame"); count = 0; label = new JLabel("Not Start"); JPanel labelPanel = new JPanel(); labelPanel.add(label); startButton = new JButton("start"); startButton.addActionListener(this); startButton.setActionCommand("start"); stopButton = new JButton("stop"); stopButton.addActionListener(this); stopButton.setActionCommand("stop"); stopButton.setEnabled(false); JPanel buttonPanel = new JPanel(); buttonPanel.add(startButton); buttonPanel.add(stopButton); bar = new JProgressBar(0, 20000); bar.setStringPainted(true); bar.setString(""); bar.setValue(0); JPanel barPanel = new JPanel(); barPanel.add(bar); getContentPane().add(labelPanel, BorderLayout.PAGE_START); getContentPane().add(buttonPanel, BorderLayout.PAGE_END); getContentPane().add(barPanel, BorderLayout.CENTER); } private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout(new BorderLayout()); } return jContentPane; } }

    • ベストアンサー
    • Java
  • 上に色をつけるJPanelを作りたい

    つい先日も質問させていただきましたが、また分からないことがでてきたのでお聞きします。 JPanelのなかにOverlayLayoutで2枚のJPanel(上にglassPane、下にcontentPane)を配置し、overがtrueになったらglassPaneに色を書くようにしたいと思っています。 ですが、下のcontentPane部分にボタンなどがあると、その部分にうまく色がつきません。 どうすればいいのでしょうか。よろしくお願いします。 自分で組んでみたコードを示します。 ****** import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JLabel{ private JPanel glassPane; private JPanel contentPane = new JPanel(); private JButton button1 = new JButton("OverlayTest"); private boolean over = false; public Test(){ glassPane = new JPanel(){ @Override protected void paintComponent(final Graphics g) { super.paintComponent(g); if(!over)return; Graphics2D g2 = (Graphics2D) g; g2.setColor(new Color(Color.MAGENTA.getRed(), Color.MAGENTA.getGreen(), Color.MAGENTA.getBlue(), 150)); g2.fillRect(0, 0, this.getWidth(), this.getHeight()); } }; button1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setOver(!over); glassPane.repaint(); //glassPane.revalidate(); } }); contentPane.setLayout(new GridBagLayout()); contentPane.add(button1); glassPane.setOpaque(false); setLayout(new OverlayLayout(this)); add(glassPane); add(contentPane); } public void setOver(boolean over){ this.over = over; } public static void main(String[] args) { JFrame frame = new JFrame(); frame.add(new Test()); frame.setSize(500,400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }

    • ベストアンサー
    • Java

専門家に質問してみよう