Java JButton在鼠标悬停之前不会出现
当我运行我的程序时,一切都按计划进行,除了我必须在屏幕上更改卡片的按钮在鼠标移过之前不会出现。我假设这是因为无论是什么容器,是持有的图像是在它上面,但我不知道如何移动到背景中,甚至什么样的容器,我可以用来添加图像Java JButton在鼠标悬停之前不会出现,java,image,swing,jbutton,repaint,Java,Image,Swing,Jbutton,Repaint,当我运行我的程序时,一切都按计划进行,除了我必须在屏幕上更改卡片的按钮在鼠标移过之前不会出现。我假设这是因为无论是什么容器,是持有的图像是在它上面,但我不知道如何移动到背景中,甚至什么样的容器,我可以用来添加图像 import java.io.*; import java.awt.*; import javax.swing.*; import java.util.Random; import java.awt.event.*; import javax.imageio.ImageIO; impo
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.util.Random;
import java.awt.event.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
public class oneplayer extends JFrame {
BufferedImage image1, image2, image3, image4;
Random gen = new Random();
public void redo() {
int p1, p2, p3, p4;
p1 = gen.nextInt(13) + 1;
p2 = gen.nextInt(13) + 14;
p3 = gen.nextInt(13) + 27;
p4 = gen.nextInt(13) + 40;
try {
File input1 = new File("C:/Users/Mike/Desktop/eclipse/workspace/inClass/src/" + p1 + ".png");
File input2 = new File("C:/Users/Mike/Desktop/eclipse/workspace/inClass/src/" + p2 + ".png");
File input3 = new File("C:/Users/Mike/Desktop/eclipse/workspace/inClass/src/" + p3 + ".png");
File input4 = new File("C:/Users/Mike/Desktop/eclipse/workspace/inClass/src/" + p4 + ".png");
image1 = ImageIO.read(input1);
image2 = ImageIO.read(input2);
image3 = ImageIO.read(input3);
image4 = ImageIO.read(input4);
} catch (IOException ie) {
System.out.println("Error:"+ie.getMessage());
}
repaint();
}
public oneplayer() {
JPanel buttonPanel = new JPanel();
setLayout(new BorderLayout());
JButton refresh = new JButton("Refresh");
refresh.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
redo();
}
});
add(buttonPanel, BorderLayout.SOUTH);
buttonPanel.add(refresh, BorderLayout.CENTER);
redo();
}
public void paint(Graphics g) {
g.drawImage(image1, 20, 55, null);
g.drawImage(image2, 96, 55, null);
g.drawImage(image3, 172, 55, null);
g.drawImage(image4, 248, 55, null);
}
public static void main(String args[]) {
oneplayer frame = new oneplayer();
frame.setTitle("Random Cards");
frame.setSize(350, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
您需要在
paint(Graphics)
函数中调用super.paint(g)
,以确保正确显示框架内的Swing组件。尚未使用示例对此进行测试,但我认为,在覆盖框架上的绘制时,需要调用父类的绘制,以便显示框架的组件。像这样:
public void paint(Graphics g) {
super.paint(g);
g.drawImage(image1, 20, 55, null);
g.drawImage(image2, 96, 55, null);
g.drawImage(image3, 172, 55, null);
g.drawImage(image4, 248, 55, null);
}
不要重写paint()
方法。而是重写主容器的paintComponent()
调用super.paintComponent(g)
不要扩展
JFrame
,但例如JPanel
,将所有内容添加到面板中,并将面板设置为普通JFrame
实例的内容窗格。虽然技术上正确,但最好在子容器(如JPanel)上执行自定义绘制,使用其paintComponent方法而不是技术上正确的方法时,最好使用其paintComponent方法在子容器(如JPanel)上执行自定义绘制instead@user2054538:单击左侧的可接受此答案。