5

私は、ユーザーのステータス (利用可能、非表示、ビジー) を設定する 1 つの機能を備えた個人用の Java チャット クライアントに取り組んでいます。ユーザーフレンドリーにするために、これらのステータスをJMenuwithに入れましたJRadioButtonMenuItem

RadioButton問題は、各ステータスに独自のラジオ ドット カラー (またはドット アイコン) を持たせたいことです。例えば:

  • 【グリーンドット】あり
  • [赤い点] ビジー
  • [グレードット] 見えない。

JRadioButtonMenuItem3種類のカスタムで拡張しようと思ったのですが、塗装のRadioButtonMenuItem仕方がわかりません。JRadioButtonMenuItem

誰でもこの問題を解決するのを手伝ってもらえますか?

編集 1メソッドと一緒
に使用する提案をありがとう。 ただし、私の質問はラジオ ドットの変更に関するものなので、ラジオ ドットを から非表示にする方法も教えていただけますか?IconsetIcon()setSelectedIcon()
RadioButton

編集 2
これが私のアプリの現在のスクリーンショットです。
MyIM メニューバーのスクリーンショット
ご覧のとおり、その前のドットRadioButtonMenuItemはなんとなくナンセンスです。そのため、ドットを削除するか、カスタム アイコンに変更したいと思います :)

4

4 に答える 4

5

ラジオ ボタンのドットは、各ルック アンド フィールの UI デリゲートによってレンダリングされます。独自の を提供できますBasicRadioButtonUIが、その労力は簡単ではありません。Icon別の方法として、 に示すようにインターフェイスを実装しますColorIcon

于 2012-08-19T07:09:15.577 に答える
3

SwingコンポーネントのIconプロパティを使用することをお勧めします。JRadioButtonMenuItemにアイコンを設定する例を次に示します。ステータスが変更された場合は、seticonメソッドを使用してアイコンを変更してください。色の代わりにアイコンを使用する

これが例ですhttp://www.java2s.com/Code/Java/Swing-JFC/Anexampleofradiobuttonmenuitemsinaction.htm

于 2012-08-19T07:27:20.570 に答える
1

私の考えでは、JRadioButtonMenuItem の動作は問題ありません。ただ、その描画が少しばかげているだけです。しかし、私はそれを拡張したり、ペイントやそれらの悪ふざけをオーバーライドしたりしたくありません。だから私は、その行動を盗み、その絵を置き去りにするだけだと結論付けました。

ButtonGroupが s を受け入れることに気付くと思いますAbstractButtonが、私はダンジョン ハンターのソリューションが好きです: 通常JMenuItemの s を使用します。私はそれに追加し、 を盗み、画像JToggleButtonの交換を行うButtonModelを送信しますItemListener(Ramesh John が提案したように)。

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JToggleButton;

public class TestRadioCustomIcon {

    public static void main(String[] args){
        new TestRadioCustomIcon().go();
    }

    private void go(){
        JFrame frame = new JFrame("Foo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JMenuBar jmb = new JMenuBar();
        JMenu menu = new JMenu("Menu");

        JMenuItem i1 = makeFauxRadioMenuItem("Item 1");
        JMenuItem i2= makeFauxRadioMenuItem("Item 2");
        JMenuItem i3= makeFauxRadioMenuItem("Item 3");
        i1.setSelected(true);

        ButtonGroup bg = new ButtonGroup();
        bg.add(i1);
        bg.add(i2);
        bg.add(i3);

        menu.add(i1);
        menu.add(i2);
        menu.add(i3);
        jmb.add(menu);
        frame.add(jmb);
        frame.pack();
        frame.setVisible(true);
    }

    private ImageIcon selected = loadImage("C:\\path\\to\\image1.bmp");
    private ImageIcon deselected = loadImage("C:\\path\\to\\image2.bmp");
    private ItemListener il = new ItemListener(){
        @Override
        public void itemStateChanged(ItemEvent e){
            AbstractButton ab = (AbstractButton) e.getSource();
            switch(e.getStateChange()){
                case ItemEvent.SELECTED:
                    ab.setIcon(selected);
                    break;
                case ItemEvent.DESELECTED:
                    ab.setIcon(deselected);
                    break;
            }
        }
    }

    private ImageIcon loadImage(String filePath){
        try{
            BufferedImage bi = ImageIO.read(new File(filePath));
            return new ImageIcon(bi);
        } catch (IOException e){
            //sad day
            return null;
        }
    }

    private JMenuItem makeFauxRadioMenuItem(String label){
        JMenuItem item = new JMenuItem(label);
        //Make it think it's a RadioButton
        item.setModel(new JToggleButton.ToggleButtonModel());
        //When selection changes occur, swap icons
        item.addItemListener(il);
        //Assume deselected
        item.setIcon(deselected);
        return item;
    }
}

これは、ボタンの色を変更するだけでなく、古いアイコンでも機能します。

于 2014-02-26T18:31:49.243 に答える
0

RadioButtonMenuItemを拡張してカスタマイズする新しいクラスを追加しJRadioButtonMenuItemます。

Icon インターフェイスを実装して、ステータス アイコンを更新するための内部クラスを追加します。すべてのメソッドをオーバーライドして、paintIcon()現在のステータス アイコンでメソッドを更新します。

ステータス アイコンを渡してスーパー クラスを呼び出します。

super(theMenuText, new StatusIcon(theStudyIcon, getUserStatus(UserId)));

メソッドを使用して Icon を更新するための最新イベントを取得する listner を追加しますsetIcon()

于 2013-10-29T13:55:29.800 に答える