2

ユーザーがボタンをクリックしたときにラベルに画像を表示する必要があります.ActionListenerにいくつかのコードを書きましたが、機能しません

        btnNewButton.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            ImageIcon one = new ImageIcon("E:\\image1.jpg");
            panel_1.setLocation(20, 100);
            panel_1.setSize(115, 115);
            mbutton.setIcon(one);
            panel_1.add(mbutton);
            // mbutton.setText("You changed me");
        }
    });
4

1 に答える 1

4

あなたが画像を追加することについて話しているあなたのコードに関して少し混乱していますJLabelが、コードは変数を追加してmButtonそのアイコンを設定することを示しています、それは私にそれを思わせJButtonますか?

どちらの方法でも、JLabel/はJButtonすでにコンテナに追加されていますか、それとも動的に追加されていますか?

1)JLabel/JButtonが表示されているコンテナにまだ存在しない場合:

表示されているコンテナのコンポーネントのサイズ/レイアウトを追加/削除または変更した後、変更を反映するようにコンテナインスタンスを呼び出す必要がrevalidate()あります。repaint()

//code which adds component to visible panel_1

//so changes can be reflected
panel_1.revalidate();
panel_1.repaint();

2)JLabel/JButtonが表示されている場合は、 (同じ)から見たsetIconように、呼び出しrevalidate()repaint()それ自体が機能するはずです。JLabel#setIconJButton

     * 108: getfield      #294                // Field defaultIcon:Ljavax/swing/Icon;
     * 111: invokeinterface #346,  1          // InterfaceMethod javax/swing/Icon.getIconHeight:()I
     * 116: aload_2
     * 117: invokeinterface #346,  1          // InterfaceMethod javax/swing/Icon.getIconHeight:()I
     * 122: if_icmpeq     129
     * 125: aload_0
     * 126: invokevirtual #319                // Method revalidate:()V
     * 129: aload_0
     * 130: invokevirtual #318                // Method repaint:()V

したがって、LayoutManagerが新しいコンポーネントの追加を正しくサポートしておらず、表示されているスペースに配置されていないなど、他の問題が発生しています。SSCCEを投稿してください。

また、使用しているようですので、使用setSize(..)してsetLocation(..)いるように感じますAbsolute/null LayoutManagerこれはお勧めできません。多くの問題を引き起こす可能性があります。むしろ、適切なものを使用してください。詳細については、LayoutManagerこちらを参照してください。

于 2013-01-06T19:38:04.807 に答える