0

JButtonが無効になっているときのアイコンを設定したいのですが。問題は、そのようなコードです:

package problemshowcase;

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

public class ProblemShowcase {
    JFrame frame1 = null;
    JButton btn = null;

    public static void main(String[] args) {
        ProblemShowcase test = new ProblemShowcase();
        test.makeFrame();
    }

    public void makeFrame()
    {
        frame1 = new JFrame();
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame1.setSize(500,500);

        btn = new JButton();
        btn.setDisabledIcon(new ImageIcon(getClass().getResource("/test.png")));
        btn.addActionListener(new someListener());

        frame1.getContentPane().add(btn);
        frame1.setVisible(true);
    }

    class someListener implements ActionListener{
        public void actionPerformed(ActionEvent ev){
            JButton foo = (JButton) ev.getSource();

            foo.setEnabled(false);
        }
    }
}

画像がまったく表示されていない状態でクリックすると、ボタンが完全にグレー表示になります。ただし、setDisabledIcon()をsetIcon()に変更すると、クリックする前とクリックした後の両方で正しい画像が表示されます(ただし、明らかに灰色で表示されます)。ここで何が問題になっていますか?

4

3 に答える 3

2

「通常の」アイコンも設定されていない限り、JButton (および JToggleButton) は単に DisabledIcon を表示しないようです。したがって、クリックされる前にボタンの非アイコン性(私のようにマインスイーパをコーディングしている場合は必要だと思います)を維持したい場合、私の頭をよぎった唯一の解決策は、次のようにすることです:

package problemshowcase;

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

public class ProblemShowcase {
    JFrame frame1 = null;
    JButton btn = null;

    public static void main(String[] args) {
        ProblemShowcase test = new ProblemShowcase();
        test.makeFrame();
    }

    public void makeFrame()
    {
        frame1 = new JFrame();
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame1.setSize(500,500);

        btn = new JButton();
        btn.setDisabledIcon(new ImageIcon(getClass().getResource("/test.png")));
        btn.addActionListener(new someListener());

        frame1.getContentPane().add(btn);
        frame1.setVisible(true);
    }

    class someListener implements ActionListener{
        public void actionPerformed(ActionEvent ev){
            JButton foo = (JButton) ev.getSource();
            btn.setIcon(new ImageIcon(getClass().getResource("/test.png")));

            foo.setEnabled(false);
        }
    }
}

そうすれば、ボタンを無効に設定する直前に「通常の」アイコンを設定して、ボタンがまったく表示されないようにします。そこに 1x1 ピクセルの透明なものを配置することもできます。

最もエレガントなソリューションではありませんが、機能する唯一のソリューションのようです...

于 2013-01-11T20:09:10.477 に答える
1

setIcon は機能しますが、setDisabledIcon は機能しません

ここではどちらも問題なく動作します。黄色のボタンをクリックすると、赤に変わります。

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

public class ProblemShowcase {
    JFrame frame1 = null;
    JButton btn = null;

    public static void main(String[] args) {
        ProblemShowcase test = new ProblemShowcase();
        test.makeFrame();
    }

    public void makeFrame()
    {
        frame1 = new JFrame();
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        btn = new JButton();
        btn.setIcon(new ImageIcon(getImage(Color.YELLOW,200,40)));
        btn.setDisabledIcon(new ImageIcon(getImage(Color.RED,200,40)));
        btn.addActionListener(new someListener());

        frame1.getContentPane().add(btn);

        frame1.pack();
        frame1.setVisible(true);
    }

    private BufferedImage getImage(Color color, int w, int h) {
        BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.getGraphics();
        g.setColor(color);
        g.fillRect(0,0,w,h);
        g.dispose();

        return bi;
    }

    class someListener implements ActionListener{
        public void actionPerformed(ActionEvent ev){
            JButton foo = (JButton) ev.getSource();

            foo.setEnabled(false);
        }
    }
}
于 2013-01-11T18:11:45.200 に答える
0

JButton と JToggleButton では、無効なアイコンを使用する前に setIcon() と setDisabledIcon() の両方を呼び出す必要があるようです。これを回避する方法は 2 つあります。

  1. ボタン自体と同じ色の 1x1 ピクセルのアイコンで setIcon() を呼び出します。

  2. JButton または JToggleButton をサブクラス化し、独自の機能を提供します。

于 2013-01-11T20:19:35.440 に答える