我正在尝试制作我的第一个正确定制的GUI,但是我很难更改为组件绘制的图像。基本上,对于我的exitButton(一个JMenu),我覆盖了paint方法,然后添加一个Mouse监听器,但我不知道如何在鼠标输入方法中重新绘制mouseListener接口内的图像,并再次在鼠标退出方法中重新绘制。基本上我正在寻找一种重新绘制图像的方法,但我迷失了我能做什么。任何帮助将不胜感激。
以下是相关的代码段:
exitBtn = new JMenu(){
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
ImageIcon exitBtnImg = new ImageIcon("src/images/userInterface/exitBtn.gif");
g.drawImage(exitBtnImg.getImage(), 0, 5, null);
}
};
exitBtn.setOpaque(false);
exitBtn.setEnabled(false);
exitBtn.setPreferredSize(new Dimension(43, 18));
exitBtn.addMouseListener(new MouseListener() {
@Override
public void mousePressed(MouseEvent me) {
}
@Override
public void mouseClicked(MouseEvent me) {
System.exit(0);
}
@Override
public void mouseEntered(MouseEvent me) {
//ImageIcon exitBtnImg = new ImageIcon("src/images/exitBtn_hover.gif"); //The ImageIcon for the Image I want to use
System.out.println("mouse entered");
}
@Override
public void mouseExited(MouseEvent me) {
// ImageIcon exitBtnImg = new ImageIcon("src/images/exitBtn.gif");
System.out.println(“鼠标退出”); //原始图像的imageicon } @覆盖 public void mouseReleased(MouseEvent me){ } });
答案 0 :(得分:6)
我正在尝试制作我的第一个正确定制的GUI
您应该首先阅读Swing教程。我不确定你要做什么,但你的做法肯定是错误的。
您可以从How to Use Menus开始,它展示了如何使用ActionListener来处理鼠标。鼠标点击通常在菜单项上处理,而不是菜单。你通常会有类似“文件”菜单的东西,它包含一个“退出”菜单项。
然后我还会看一下JMenu API的各种方法,它们允许您在鼠标悬停或选择菜单时更改图标。也许setRolloverEnabled(),setRolloverIcon()就是你要找的。 p>
如果您仍有问题,请发布展示问题的SSCCE。
<强>更新强>
如Hovercraft所述,翻转支持不适用于菜单或菜单项。有两个问题。首先,这些组件使用不同的MouseListener。监听器不监听mouseEntered和mouseExited事件。第二个问题是两个组件的UI已经自定义,自定义图标绘制代码没有考虑按钮的翻转状态。
添加MouseListener很简单。自定义UI(这是正确的解决方案)以更好地支持翻转更为复杂。
对于一个似乎有效的简单hack,我只是更新MouseListener中的Icon,而不是让UI确定要绘制哪个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 :(得分:2)
RollOver for a button适用于交换图标,但我无法让它适用于JMenu:
import java.awt.*;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
public class SwapMenuIcons {
private static final String KENAI_1 = "http://duke.kenai.com/iconSized/duke.gif";
private static final String KENAI_2 = "http://duke.kenai.com/iconSized/penduke-transparent.gif";
private static void createAndShowUI() {
try {
Image duke1 = ImageIO.read(new URL(KENAI_1));
Image duke2 = ImageIO.read(new URL(KENAI_2));
ImageIcon icon1 = new ImageIcon(duke1);
ImageIcon icon2 = new ImageIcon(duke2);
JMenu myMenu = new JMenu();
myMenu.setIcon(icon1);
myMenu.setRolloverIcon(icon2);
myMenu.setRolloverEnabled(true);
JButton myButton = new JButton(icon1);
myButton.setRolloverIcon(icon2);
JPanel btnPanel = new JPanel();
btnPanel.add(myButton);
JMenuBar menuBar = new JMenuBar();
menuBar.add(myMenu);
JFrame frame = new JFrame("SwapMenuIcons");
frame.setJMenuBar(menuBar);
frame.add(btnPanel, BorderLayout.CENTER);
frame.setPreferredSize(new Dimension(400, 300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
答案 2 :(得分:1)
一堆不同的方式。最脏的是有一个全局布尔值isMouseHovering,你可以使用mouseEntered和mouseExited在true和false之间切换。在这两个鼠标事件中,调用repaint();在重绘方法中,根据该布尔值的值绘制图像。