JButton()只在鼠标hover时工作

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

全屏幕是另一个类,它提供了一个全屏的框架。 JButton上有ImageIcon。 bg1.png是一个背景图像问题是这些JButton只有在鼠标hover的时候才会显示,否则它们不会出现。

可能你有布局的问题,你试图把JButtons的绝对边界添加到使用非null布局pipe理器的容器中。 build议

  • 不要使用setBounds和绝对定位来调整和放置组件。
  • 仔细阅读并使用布局pipe理器为您完成这个繁重工作: 课程:布置容器内的组件
  • 添加完所有组件后,不要忘记在JFrame上调用pack()
  • 在调用pack() setVisible(true)之后调用setVisible(true) ,并在将所有组件添加到GUI之后再次调用它们
  • 如果您绝对需要使用组件的绝对定位,则可以使用空布局,但无论如何,您都应该尽量避免使用它。

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

构造JButton(图标)知道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); } } 

看起来你在添加button之后永远不会重新绘画。

添加它们之后,我会在其中添加一个重绘。

刚刚有一个类似的问题…

我相信这个故障是由覆盖paint()方法引起的。 默认的paint()方法自动调用所有组件上的repaint(),但是通过覆盖paint()方法,组件不再被重新绘制。 所以,解决的办法是调用重写paint()方法中所有组件的repaint()。

为我工作,希望能为别人工作;)