私はあなたがSwingのチュートリアルを読むことから始めなければならない私の最初適切にカスタマイズされたGUI
を作るしようとしています。私はあなたが何をしようとしているのかは分かりませんが、あなたのアプローチは間違っているようです。
これは、マウスクリックを処理するためにActionListenerを使用する方法を示すHow to Use Menusから始まります。マウスのクリックは、一般にメニューではなくメニューで処理されます。一般的には、「終了」メニュー項目を含む「ファイル」メニューのようなものがあります。
次に、マウスオーバーまたはメニューを選択したときにアイコンを変更できるさまざまなメソッドのJMenu APIも見ていきます。たぶんsetRolloverEnabled()、setRolloverIcon()はあなたが探しているものです。
問題が解決しない場合は、問題を示すSSCCEを投稿してください。
更新:
ホバークラフトで述べたように、ロールオーバーのサポートは、メニューまたはメニュー項目には機能しません。 2つの問題があります。まず、これらのコンポーネントによって異なるMouseListenerが使用されます。リスナーはmouseEnteredイベントとmouseExitedイベントをリッスンしません。 2つ目の問題は、2つのコンポーネントのUIがカスタマイズされており、カスタムアイコンのペイントコードでボタンのロールオーバー状態が考慮されていないことです。
MouseListenerを追加するのは簡単です。ロールオーバーを適切にサポートするためのUI(適切な解決策)をカスタマイズすることは、より複雑です。
単純なハックがうまくいくように見えますが、私は、どのアイコンをペイントするかをUIが決定するのではなく、MouseListenerのIconを更新するだけです。この要件を忘れ、メニューやメニュー項目のアイコンを変更しない通常のUIを使用することをお勧めします。ご自身の責任で、次を使用します。ボタンの
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ButtonRollover extends JFrame
{
Icon normal;
Icon rollover;
Icon selected;
public ButtonRollover()
{
MouseListener ml = new RolloverButtonListener();
normal = new ColorIcon(Color.GREEN, 10, 10);
rollover = new ColorIcon(Color.RED, 10, 10);
selected = new ColorIcon(Color.BLUE, 10, 10);
setLayout(new FlowLayout());
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu menu = (JMenu)createButton(new JMenu(), "Menu");
menu.addMouseListener(ml);
menuBar.add(menu);
JMenuItem menuItem = (JMenuItem)createButton(new JMenuItem(), "MenuItem");
menuItem.addMouseListener(ml);
menu.add(menuItem);
JButton button = (JButton)createButton(new JButton(), "Button");
add(button);
JCheckBox checkBox = (JCheckBox)createButton(new JCheckBox(), "CheckBox");
add(checkBox);
JRadioButton radioButton = (JRadioButton)createButton(new JRadioButton(), "RadioButton");
add(radioButton);
}
public AbstractButton createButton(AbstractButton button, String text)
{
button.setText(text);
button.setIcon(normal);
button.setSelectedIcon(selected);
button.setRolloverIcon(rollover);
button.setRolloverSelectedIcon(rollover);
System.out.println(text);
MouseListener[] mls = button.getMouseListeners();
for (MouseListener ml: mls)
{
System.out.println("\t" + ml);
}
return button;
}
class RolloverButtonListener extends MouseAdapter
{
private Icon normal;
public void mouseEntered(MouseEvent e)
{
AbstractButton b = (AbstractButton) e.getSource();
ButtonModel model = b.getModel();
if (b.isRolloverEnabled() && !SwingUtilities.isLeftMouseButton(e))
{
normal = b.getIcon();
b.setIcon(b.getRolloverIcon());
model.setRollover(true);
}
}
public void mouseExited(MouseEvent e)
{
AbstractButton b = (AbstractButton) e.getSource();
ButtonModel model = b.getModel();
if(b.isRolloverEnabled())
{
b.setIcon(normal);
model.setRollover(false);
}
};
}
public class ColorIcon implements Icon
{
private Color color;
private int width;
private int height;
public ColorIcon(Color color, int width, int height)
{
this.color = color;
this.width = width;
this.height = height;
}
public int getIconWidth()
{
return width;
}
public int getIconHeight()
{
return height;
}
public void paintIcon(Component c, Graphics g, int x, int y)
{
g.setColor(color);
g.fillRect(x, y, width, height);
}
}
public static void main(String[] args)
{
try
{
// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e) { }
ButtonRollover frame = new ButtonRollover();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setSize(400, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
-1、ロールオーバーのサポートが組み込まれていAbstractButtonコンポーネントに追加します。車輪を再構築しないでください。 – camickr
良い点、私は少しのためにスイングの世界から出てきました。 – Bryan
@camickr:ただし、JMenuオブジェクトはAbstractButtonから継承されていても動作しません。これを証明するには、ChangeListenerをJMenuオブジェクトまたはそのモデルに配置します。マウスオーバーの応答は表示されません。 –