Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JButtonにJPanelを貼り付けた時の挙動

こんばんは。
今、JButtonにJPanelを介して自分で描いたものを貼り付けて表示させようと思っています。
しかし、いざボタンの大きさを適切な大きさに調節してみると、ボタンは期待した大きさになるのに肝心のパネルが表示されません。
setPreferredSizeでやってもsetSizeでやっても無理でした。
おや?と思って簡単なプログラム PanelButton.java を書いてみたのですが、やはりボタンを一定の大きさ以上にしないと表示されません。
ボタンの設定する大きさが小さいと、コンストラクタしか通っていない上にsetBackgroundで設定した色にすらなりませんでした。
厳密にはgetBackgroundで確認してみると、設定されているはずの色が実際の画面には反映されていないようなのです。
ここは大人しくJButtonに直接描き込むという方法を取るしかないのでしょうか?



----------------------------------------

/*
 * JButtonにJPanelを貼り付ける
 *
 * サンプルソース PanelButton.java
 *
 */


import java.awt.*;
import javax.swing.*;

public class PanelButton extends JFrame{
  private JPanel mainPanel = new JPanel();
  private JButton button1 = new JButton();
  private JButton button2 = new JButton();
  private JButton button3 = new JButton();

  public PanelButton(){
    getContentPane().add( mainPanel );
    mainPanel.setLayout( new FlowLayout( FlowLayout.CENTER, 20, 5 ) );

    button1.add( new MyPanel( "1", Color.green ) );
    mainPanel.add( button1 );

    button2.setPreferredSize( new Dimension( 50, 50 ) );  // 問題箇所
    button2.add( new MyPanel( "2", Color.yellow ) );
    mainPanel.add( button2 );

    button3.setPreferredSize( new Dimension( 30, 30 ) );  // 問題箇所
    button3.add( new MyPanel( "3", Color.red ) );
    mainPanel.add( button3 );

    mainPanel.add( new MyButton( "4", Color.blue ) );  // 期待する動作

    mainPanel.add( new JLabel( "  ボタン1   ボタン2 ボタン3 ボタン4" ) );
  }

  class MyPanel extends JPanel{
    String panelNumber = null;

    public MyPanel( String number, Color color ){
      panelNumber = number;
      setBackground( color );
      //setSize( new Dimension( 30, 30 ) );
      setPreferredSize( new Dimension( 30, 30 ) );

      System.out.println( "ボタン " + panelNumber + " のパネルのコンストラクタを通過 -- " + getBackground() );  // 確認用
    }

    public void paintComponent( Graphics g ){
      super.paintComponent( g );

      g.setColor( Color.black );
      g.drawOval( 5, 5, 10, 10 );

      System.out.println( "ボタン " + panelNumber + " のパネルの描画メソッドを通過" );  // 確認用
    }
  }

  class MyButton extends JButton{
    String panelNumber = null;

    public MyButton( String number, Color color ){
      panelNumber = number;
      setBackground( color );
      setPreferredSize( new Dimension( 30, 30 ) );

      System.out.println( "ボタン " + panelNumber + " のコンストラクタを通過 -- " + getBackground() );  // 確認用
    }

    public void paintComponent( Graphics g ){
      super.paintComponent( g );

      g.setColor( Color.black );
      g.drawOval( 5, 5, 10, 10 );

      System.out.println( "ボタン " + panelNumber + " の描画メソッドを通過" );  // 確認用
    }
  }

  public static void main( String [] args ){
    SwingUtilities.invokeLater( new Runnable(){
      public void run(){
        PanelButton frame = new PanelButton();
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();

        frame.setSize( 300, 120 );
        frame.setTitle( "サンプル" );
        frame.setLocation( ( d.width - 300 ) / 2, ( d.height - 120 ) / 2 );
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );

        frame.setResizable( false );
        frame.setVisible( true );
      }
    } );
  }
}

3

回答

83364

閲覧

3件の回答

評価

0

JButton(Icon icon) ってな、コンストラクタがありますよ。

評価

0

不良社員さん、回答ありがとうございます。

> JButton(Icon icon) ってな、コンストラクタがありますよ。


後で気づきました・・・うかっりですorz
以前にImageIcon使ってた気がします。
でも何故、JPanelじゃだめなのかなと。
コンストラクタしか通らないのもおかしいし、repaint()してもうんともすんとも言いません。
謎です。

評価

0

親子関係からオブジェクトの振る舞いを類推できるのは
メリットのひとつとは思うけど、所詮リファレンスに勝るものではないしね。
ここで必要なのはリファレンスを当たるなり、
ソースを読んだりすることであって、
ぼやくことじゃないでしょ。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。