JButton()仅在鼠标悬停时起作用

3
    import java.awt.*;
    import java.awt.image.*;
    import java.awt.event.*;
    import javax.imageio.*;
    import java.lang.*;
    import java.io.*;
    import javax.swing.*;
    public class MainClass extends Component{
       private Image bg;
       private ImageIcon newgame;
       private ImageIcon quit;
       private ImageIcon options;
       private JButton bquit;
       private JButton boptions;
       private JButton bnewgame;
       private static Container pane; //Container

    public void loadImage() {
        try {
            bg=ImageIO.read(new File("bg1.png"));
        } catch (Exception e) {
        }
        if(bg!=null)
            repaint();

    }
    public void paint(Graphics g) {
        g.drawImage(bg,0,0,null);
    }
    public void imageButtons(JFrame f) {
        try {
            quit= new ImageIcon("quit.png");
            options=new ImageIcon("options.png");
            newgame= new ImageIcon("newgame.png");
        }catch(Exception e){}    
        bnewgame= new JButton(newgame);
        boptions= new JButton(options);
        bquit= new JButton(quit);
        bnewgame.setBounds(150,100,400,89);
        boptions.setBounds(150,200,400,89);
        bquit.setBounds(150,300,400,89);
        pane.add(bquit);
        pane.add(boptions);
        pane.add(bnewgame);
    }   


    public static void main(String args[]) {

        MainClass o=new MainClass();    
        FullScreen fs=new FullScreen(); 
        JFrame f1=new JFrame("TITLE");
        pane=f1.getContentPane();
        fs.fullScreenIt(f1);
        pane.add(o);
        f1.setVisible(true);
        o.loadImage();
        o.imageButtons(f1);
    }
}

Fullscreen是另一个类,它提供了全屏框架。 JButton上有ImageIcon。bg1.png是背景图像。 问题是这些JButton只有在鼠标悬停时才可见,否则它们不会出现。

4个回答

7

Icon/ImageIcon直接添加到JButton中,而不是使用AWT的paint()Swing JComponentspaintComponent()来进行绘制。

构造函数JButton(Icon)支持Icon或ImageIcon参数。

enter image description here

来自编程

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

public class ButtonsIcon extends JFrame {

    private static final long serialVersionUID = 1L;
    private ImageIcon errorIcon = (ImageIcon) UIManager.getIcon("OptionPane.errorIcon");
    private Icon infoIcon =  UIManager.getIcon("OptionPane.informationIcon");
    private Icon warnIcon =  UIManager.getIcon("OptionPane.warningIcon");

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                ButtonsIcon t = new ButtonsIcon();
            }
        });
    }

    public ButtonsIcon() {
        setLayout(new GridLayout(0, 2, 4, 4));

        JButton button = new JButton();
        button.setBorderPainted(false);
        button.setBorder(null);
        button.setFocusable(false);
        button.setMargin(new Insets(0, 0, 0, 0));
        button.setContentAreaFilled(false);
        button.setIcon((errorIcon));
        button.setRolloverIcon((infoIcon));
        button.setPressedIcon(warnIcon);
        button.setDisabledIcon(warnIcon);
        add(button);

        JButton button1 = new JButton();
        button1.setBorderPainted(false);
        button1.setBorder(null);
        button1.setFocusable(false);
        button1.setMargin(new Insets(0, 0, 0, 0));
        button1.setContentAreaFilled(false);
        button1.setIcon((errorIcon));
        button1.setRolloverIcon((infoIcon));
        button1.setPressedIcon(warnIcon);
        button1.setDisabledIcon(warnIcon);
        add(button1);
        button1.setEnabled(false);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }
}

我使用Paint绘制了背景图像bg1.png。 - H S
@Harvinder Singh Sidhu,您的问题已经有两个正确答案(+1),那么为什么还要发布另外一个建议呢? - mKorbel
@mKorbel:这太棒了,我从来没有尝试过边框和内容区域的东西。你总是能教给我一些新东西 :-) 谢谢。 - nIcE cOw
很高兴再次见到你 :-) - mKorbel

5
很可能您遇到了布局问题,您正在试图将带有绝对边界的JButton添加到使用非空布局管理器的容器中。建议如下:
  • 不要使用setBounds和绝对定位来调整组件大小和位置。
  • 学习并使用布局管理器来完成此繁重的工作:教程:在容器内布置组件
  • 在添加所有组件后,请不要忘记在JFrame上调用pack()
  • 在调用pack()之后调用setVisible(true),并且只有在将所有组件添加到GUI后才会再次调用both
  • 如果您绝对需要使用组件的绝对定位,则可以使用空布局,但无论如何,您都应该尽量避免使用它。

好的,还有一件事,我应该在哪里添加背景图像?是在窗格(pane) // 容器(Container) 还是在框架(Frame)f1? - H S
空布局会带来更多问题,因为它使第一个按钮(即bnewgame)绘制在整个屏幕上,成为唯一的全屏按钮,这是非常糟糕的。我尝试使用布局管理器,但它们会使事情变得更加复杂,并且背景图像无法绘制。 - H S
“这并不是这个问题的一部分,而是一个单独的问题。我建议您在此论坛搜索如何在Swing GUI中添加背景图像,如果仍然遇到困难,请回来继续寻求帮助。关于您的第二个陈述,它只意味着您使用它们的方式有误,但并不意味着您不应该使用它们。” - Hovercraft Full Of Eels
好的,谢谢你的帮助,但问题不是布局管理器,我已经解决了。 - H S

3

看起来在添加按钮后您从未重新绘制。

我建议在添加按钮后加入重绘。


1

刚遇到了类似的问题...

我认为这个故障是由于覆盖了paint()方法引起的。默认的paint()方法会自动调用所有组件的repaint(),但是通过覆盖paint()方法,组件停止被重绘。因此,解决方案是在覆盖的paint()方法中调用所有组件的repaint()。

对我有用,希望对其他人也有用 ;)..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接