【问题标题】:JButton() only working when mouse hoversJButton() 仅在鼠标悬停时工作
【发布时间】:2011-10-27 16:12:09
【问题描述】:
    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 是另一个提供全屏 Frame 的类。 JButton 上有 ImageIcon 。 bg1.png 是背景图片 问题是这些 JButton 仅在鼠标悬停时才可见,否则它们不会出现。

【问题讨论】:

    标签: java swing mouseevent jbutton null-layout-manager


    【解决方案1】:

    将Icon/ImageIcon 直接添加到JButton 而不是paint() 用于AWT 或paintComponent() 用于Swing JComponents

    Constructor JButton(Icon) 知道 Icon 或 ImageIcon

    来自代码

    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);
        }
    }
    

    【讨论】:

    • 我用颜料画了那个背景图片 bg1.png
    • @Harvinder Singh Sidhu 您对您的问题有两个正确答案 (+1),那么为什么要针对两个正确答案发布另一个建议
    • @mKorbel :这太棒了,从来没有尝试过边界和内容区域。你总是在那里教新东西:-) 谢谢。
    • 很高兴再次在这里见到你 :-)
    【解决方案2】:

    您可能遇到布局问题,您尝试将具有绝对边界的 JButton 添加到使用非空布局管理器的容器中。建议

    • 不要使用 setBounds 和绝对定位来调整和放置组件的大小。
    • 继续阅读并使用布局管理器为您完成这项繁重的工作:Lesson: Laying Out Components Within a Container
    • 添加所有组件后,不要忘记在 JFrame 上调用 pack()
    • 在调用pack() 之后调用setVisible(true) 并在将所有组件添加到您的GUI 之后再次调用both。
    • 如果您绝对需要使用组件的绝对定位,则可以使用 null 布局,但无论如何,您都应该努力避免使用它。

    【讨论】:

    • 好吧,我应该在哪里添加背景图片?到窗格 // 一个容器还是到框架 f1?
    • null 布局带来了更多问题,因为它使第一个按钮(即 bnewgame)在整个屏幕上绘制,一个全屏按钮在屏幕上没有其他内容,这太可怕了,我尝试使用布局管理器,但它们使事物和背景图像不会绘制
    • 这不是这个问题的一部分,而是一个单独的问题。我建议您搜索此论坛以将背景图像添加到 Swing GUI,然后如果您仍然卡住,请返回。关于您的第二个陈述,这仅意味着您使用错误,但并不意味着您不应该使用它们。
    • 好的,感谢您的帮助,但问题不在于布局管理器,我解决了。
    【解决方案3】:

    添加按钮后,您似乎永远不会重新绘制。

    我会在你添加它们之后在其中添加重绘。

    【讨论】:

      【解决方案4】:

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

      我相信故障是由覆盖 paint() 方法引起的。 默认的paint() 方法会自动在所有组件上调用repaint(),但是通过覆盖paint() 方法,组件将停止重新绘制。 因此,解决方案是在覆盖的 paint() 方法中的所有组件上调用 repaint()。

      为我工作,希望对其他人有用;)..

      【讨论】:

        猜你喜欢
        • 2013-01-04
        • 1970-01-01
        • 2014-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多