2014-11-20 3 views
1

Цель: разместить JButton на верхней части изображения, загружаемого из другого класса. Проблема: только JButton или изображение может отображатьсяРазмещение JButton на изображении

//main class 
JPanel mPanel.add(new JButton("ddd")); 
mPanel.add(drawbg); 


class DrawBg extends JPanel { 

    public Dimension getPreferredSize() { 
      return new Dimension(1280, 720); 
     } 

     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      // background 
      Image img = new ImageIcon(getClass().getResource("/images/test_bg.jpg")).getImage(); 
      int imgX = img.getWidth(null); 
      int imgY = img.getHeight(null); 
      g.drawImage(img, (getWidth() - imgX), (getHeight() - imgY), imgX, imgY, null); 

    } 
+2

Проблема заключается в том, что вы добавили 2 вещи (ваш JButton и вашу drawbg панель) к вашему mPanel. Если вы просто добавите JButton в панель drawbg, он должен работать – ControlAltDel

ответ

2

Редактировать Ах да, как и ControlAltDel указывает, что вы не добавляете ваш JButton к чертежу примеру JPanel. Просто сделайте это, и ваша проблема решена.


Я не вижу ошибки в вашем коде, поэтому он может быть в коде, который не показан. Я вижу проблему в том, что вы читаете изображение внутри paintComponent, что никогда не должно быть сделано, поскольку оно замедляет живопись и тем самым замедляет воспринимаемую отзывчивость вашей программы. Кроме того, зачем перечитывать изображение с каждой краской. Вместо этого прочитайте его один раз.

Например:

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

public class ButtonOnImg extends JPanel { 
    public static final String IMG_PATH = "https://duke.kenai.com/gun/Gun.jpg"; 
    private BufferedImage img; 

    public ButtonOnImg() throws IOException { 
     URL url = new URL(IMG_PATH); 
     img = ImageIO.read(url); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (img != null) { 
     g.drawImage(img, 0, 0, null); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (img == null) { 
     return super.getPreferredSize(); 
     } else { 
     int w = img.getWidth(); 
     int h = img.getHeight(); 
     return new Dimension(w, h); 
     } 
    } 

    private static void createAndShowGui() { 
     try { 
     ButtonOnImg mainPanel = new ButtonOnImg(); 

     mainPanel.add(new JButton("Button!")); 

     JFrame frame = new JFrame("ButtonOnImg"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

Который показывает, как:

enter image description here

Смежные вопросы