2013-10-26 26 views
2

我试图在顶部显示文本并在中心布局中显示按钮。但是输出有点奇怪。它显示了很多按钮。这段代码有什么问题?JButton在设置背景图像后不止一次显示

import java.awt.BorderLayout; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.LayoutManager; 
import java.awt.Toolkit; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class ImagePaneTest { 

    public static void main(String a[]) { 
     TransparentPanel transparentPanel = new TransparentPanel(
       new BorderLayout()); 

     JPanel p = new JPanel(); 
     JLabel la = new JLabel("Title"); 
     p.add(la); 
     p.setOpaque(false); 

     JPanel p1 = new JPanel(); 
     JButton la1 = new JButton("Button"); 
     p1.add(la1); 
     p1.setOpaque(false); 

     JFrame fr = new JFrame(); 

     fr.getContentPane().add(transparentPanel); 
     transparentPanel.add(p, BorderLayout.NORTH); 
     transparentPanel.add(p1, BorderLayout.CENTER); 

     fr.setSize(500, 500); 
     fr.setVisible(true); 
    } 

} 

class TransparentPanel extends JPanel { 

    public TransparentPanel(LayoutManager l) { 
     super.setLayout(l); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponents(g); 

     Image image = Toolkit.getDefaultToolkit().getImage(
       ImagePaneTest.class.getResource("/images/startback.jpg")); 

     g.drawImage(image, 0, 0, null); 
    } 
} 
+1

不要在绘画方法加载图像。只要Swing确定组件需要重新绘制,绘画方法就会被调用,因此绘画方法可以被多次调用,并且每次读取图像都没有意义。 – camickr

+0

当然。谢谢!应该怎么做才能在第一次加载图像?在手动调整框架后出现背景图像 – Mercenary

+0

图像应该在构造函数中加载。另外,drawImage()方法中的“null”为“this”。 – camickr

回答

1

使用super.paintComponent(g);的风俗画代码,而不是paintComponentspaintComponents留给 的API需要的时候

http://www.oracle.com/technetwork/java/painting-140037.html被称为:

Swing程序应该重写paintComponent(),而不是覆盖 paint()方法。虽然API允许,但通常没有理由重写paintBorder()或paintComponents()(如果你这样做,确保你知道你在做什么!)。

编辑:我刚才看到你将覆盖paintComponent,所以超级调用应该是paintComponent

+0

应该如何在首次加载图像时加载图像?在手动调整框架后出现背景图像 – Mercenary

+0

@ user1739812我试过了,图像加载时无需调整大小 – Evans

+0

哦,那真是奇怪!你使用了与上面相同的代码吗?我仍然看到空白的背景! – Mercenary

2

应该super.paintComponent(g);

@Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      Image image = Toolkit.getDefaultToolkit().getImage(
        ImagePaneTest.class.getResource("/images/startback.jpg")); 

      g.drawImage(image, 0, 0, null); 
     } 
+0

这样做,只有在调整窗口大小时才会显示图像(强制java调用paintComponent)。 – Izmaki

+0

@Izaki:因为我没有和我一起的形象,你能告诉你在用什么? –

+0

我不是请求者,我只是指出了它。 ;)我用一个可用于测试目的的图像替换了图像。它似乎是应用程序的背景图像。 – Izmaki