我如何将JButton放在图像上?

我正在尝试修复一个JFrame,其中将有一个背景图像,并在图像JButtons上将执行一些命令。 我尝试在没有布局的情况下进行,因为我想在JFrame的某些特定位置放置小按钮,但每次我这样做时,背景图像都会出现在前面,或者JFrame的大小等于JFrame大小。 使用以下代码,JButton与JFrame具有相同的大小。 我试图改变JButton的大小和位置,但没有。 你能帮我吗?

这是代码

public final class Test extends JComponent { private Image background; private JFrame frame; private Dimension dimension; public Test() { dimension = new Dimension(15, 15); frame = new JFrame("Iphone"); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(this); frame.setBounds(641, 0, 344, 655); frame.setVisible(true); test = displayButton("tigka"); frame.getContentPane().add(test); } public void update(Graphics g) { paint(g); } public void paintComponent(Graphics g) { super.paintComponents(g); g.drawImage(background, 0, 25, null); // draw background // label(); test = displayButton("test"); } public JButton displayButton(String name) { JButton button = new JButton(name); button.setSize(100, 100); button.setPreferredSize(dimension); return button; } 

 public final class Test extends JComponent { private Image background; private JFrame frame; private Dimension dimension; public Test() { dimension = new Dimension(15, 15); frame = new JFrame("Iphone"); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(this); frame.setBounds(641, 0, 344, 655); frame.setVisible(true); test = displayButton("tigka"); frame.getContentPane().add(test); } public void update(Graphics g) { paint(g); } public void paintComponent(Graphics g) { super.paintComponents(g); g.drawImage(background, 0, 25, null); // draw background // label(); test = displayButton("test"); } public JButton displayButton(String name) { JButton button = new JButton(name); button.setSize(100, 100); button.setPreferredSize(dimension); return button; } 

public final class Test extends JComponent { private Image background; private JFrame frame; private Dimension dimension; public Test() { dimension = new Dimension(15, 15); frame = new JFrame("Iphone"); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(this); frame.setBounds(641, 0, 344, 655); frame.setVisible(true); test = displayButton("tigka"); frame.getContentPane().add(test); } public void update(Graphics g) { paint(g); } public void paintComponent(Graphics g) { super.paintComponents(g); g.drawImage(background, 0, 25, null); // draw background // label(); test = displayButton("test"); } public JButton displayButton(String name) { JButton button = new JButton(name); button.setSize(100, 100); button.setPreferredSize(dimension); return button; }

public final class Test extends JComponent { private Image background; private JFrame frame; private Dimension dimension; public Test() { dimension = new Dimension(15, 15); frame = new JFrame("Iphone"); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(this); frame.setBounds(641, 0, 344, 655); frame.setVisible(true); test = displayButton("tigka"); frame.getContentPane().add(test); } public void update(Graphics g) { paint(g); } public void paintComponent(Graphics g) { super.paintComponents(g); g.drawImage(background, 0, 25, null); // draw background // label(); test = displayButton("test"); } public JButton displayButton(String name) { JButton button = new JButton(name); button.setSize(100, 100); button.setPreferredSize(dimension); return button; }

您需要更改content pane以获取Frame的背景。

 public static void main(String[] args) throws IOException { JFrame frame = new JFrame("Test"); frame.setContentPane(new JPanel() { BufferedImage image = ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png")); public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image, 0, 0, 300, 300, this); } }); frame.add(new JButton("Test Button")); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 300); frame.setVisible(true); } 

输出:

截图

您是否尝试在标签中使用带有HTML的JLabel? 像这样的东西:

 import javax.swing.*; public class SwingImage1 { public static void main( String args[] ) { JFrame frm = new JFrame( "Swing Image 1" ); JLabel lbl = new JLabel( "" ); frm.getContentPane().add( lbl ); frm.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); frm.pack(); frm.setVisible( true ); } } 

然后在你的标签上你可以添加你的按钮?

你应该交换这两行:

 super.paintComponents(g); //paints the children, like the button g.drawImage(background, 0, 25, null); // draw background later possibly overwriting the button 

因此它应该是这个顺序:

 g.drawImage(background, 0, 25, null); super.paintComponents(g); 

此外,请注意内容窗格的默认布局是BorderLayout。 因此,您可以将内容窗格的布局显式设置为null。

 /*it is simple to put button on image first set image by making object then make button object & add the button object direct to image object rather then add to frame.*/ package frame; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; public class frame { public frame() { JFrame obj = new JFrame("Banking Software"); JButton b1 = new JButton("Opening Account"); JLabel image = new JLabel(new ImageIcon("money.jpg")); image.setBounds(0,0, 1600, 1400); obj.setExtendedState(JFrame.MAXIMIZED_BOTH); obj.add(image); b1.setBounds(500,400, 100, 40); image.add(b1); obj.setVisible(true); } public static void main(String args[]) { new frame(); } }