arka

2016-04-06 13 views
2

gibi bir görüntü ile bir Jpanel üzerinde JButtons görünür kılmak için nasıl arka plan olarak bir görüntü ile bir JPanel yaptık. Ancak JPanel ilk kez yüklenirken, eklenen bileşenlerin geri kalanı ancak görüntü görünmez. Fareyi resmin üzerine getirdikten sonra düğmeler görünür hale gelir. Paneli yüklerken arka plan olarak görüntünün yanı sıra JButtons görünümünü nasıl yapabilirsiniz.arka

contentPane = new JPanel(); 
    contentPane.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    homePanel.setBounds(10, 11, 959, 620); 
    homePanel.setLayout(null); 

    JPanel wizardPanel = new JPanel(); 
    wizardPanel.setBounds(10, 295, 545, 336); 
    wizardPanel.setLayout(null); 
    homePanel.add(wizardPanel); 

    JLabel backgroundLabel; 
    try { 
     backgroundLabel = new JLabel(new ImageIcon(ImageIO.read(new File("images/nature.jpg")))); 
     backgroundLabel.setBounds(0, 0, 545, 336); 
     wizardPanel.add(backgroundLabel); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


    JButton btnNewButton = new JButton("New button"); 
    btnNewButton.setBounds(309, 95, 89, 23); 
    wizardPanel.add(btnNewButton); 

    JButton btnNewButton_1 = new JButton("New button"); 
    btnNewButton_1.setBounds(309, 150, 89, 23); 
    wizardPanel.add(btnNewButton_1); 

    JButton btnNewButton_2 = new JButton("New button"); 
    btnNewButton_2.setBounds(309, 212, 89, 23); 
    wizardPanel.add(btnNewButton_2); 
+2

deneyin bir kez tüm bileşenleri eklenmiştir içerik bölmesinde, üzerinde 'revalidate()' ve 'rötuş()' aramak için. Mümkünse – Berger

+0

kodlayın. –

+1

Bir [Minimal, Tam ve Doğrulanabilir örnek] (http://stackoverflow.com/help/mcve) olması iyi olurdu. Bu, sorunuzu cevaplandırmayı çok daha kolaylaştıracaktır. – Tiz

cevap

0

bu delice! Ben ..... çalışır Görüntü yükleme bölümünün üstünde JButtons başlatma kod bloğu yerleştirerek

 package demo; 

    import java.awt.EventQueue; 
    import java.io.File; 
    import java.io.IOException; 

    import javax.imageio.ImageIO; 
    import javax.swing.ImageIcon; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 
    import javax.swing.SwingUtilities; 
    import javax.swing.UIManager; 
    import javax.swing.border.EmptyBorder; 

public class demoframe extends JFrame { 

/** 
* 
*/ 
private static final long serialVersionUID = 1436190962490331120L; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       demoframe frame = new demoframe(); 

       UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
       SwingUtilities.updateComponentTreeUI(frame); 

       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public demoframe() { 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 988, 678); 
    JPanel contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    JPanel panel = new JPanel(); 
    panel.setBounds(10, 11, 501, 361); 
    contentPane.add(panel); 
    panel.setLayout(null); 

    JButton btnNewButton = new JButton("New button"); 
    btnNewButton.setBounds(322, 112, 89, 23); 
    panel.add(btnNewButton); 

    JButton button = new JButton("New button"); 
    button.setBounds(322, 172, 89, 23); 
    panel.add(button); 

    JButton button_1 = new JButton("New button"); 
    button_1.setBounds(322, 244, 89, 23); 
    panel.add(button_1); 

    JLabel backgroundLabel; 
    try { 
     backgroundLabel = new JLabel(new ImageIcon(ImageIO.read(new File("images/nature.jpg")))); 
     backgroundLabel.setBounds(0, 0, 501, 361); 
     panel.add(backgroundLabel); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 



    JPanel panel_1 = new JPanel(); 
    panel_1.setBounds(521, 11, 441, 361); 
    contentPane.add(panel_1); 

    JPanel panel_2 = new JPanel(); 
    panel_2.setBounds(10, 383, 952, 246); 
    contentPane.add(panel_2); 

} 
} 

Output looks like this now

+0

Bileşenlerinizi diğerine yerleştirmek kötü bir fikirdir. Daha iyi bir yol, görüntünüzü arka plan olarak boyamaktır. –

+0

@SergiyMedvynskyy ... bu gerçekten anlam ifade etmiyor, biz her zaman üst üste üst üste yerleştiriyoruz, her şeyin nasıl işlediğini ... eğer resmi çizecekseniz, bir bileşene ihtiyacınız olacak (tercihen bir "JPanel" ile boyayın) ama hala aynı şey – MadProgrammer

+0

@MadProgrammer haklısınız. Düğme etiketi üzerine yerleştirmenin kötü bir fikir olduğunu kastediyorum. –

1

Hızlı çözüm doğrudan görüntüye JFrame içerik bölmesini ayarlama ve bu JFrame içeriği bölmesine bileşenleri ekleyerek olabilir: Burada

enter image description here

benim kod parçasıdır. Kodunuzun JFrame sınıfının gövdesinden olduğunu varsayarak. Benim önerim az çok şu şekilde görünür:

 JRootPane rootpane = new JRootPane(); 
     JPanel contentPane = new JPanel(); 
     contentPane.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null)); 
     rootpane.setContentPane(contentPane); 
     contentPane.setLayout(null); 

     JPanel homePanel = new JPanel(); 
     homePanel.setBounds(10, 11, 959, 620); 
     homePanel.setLayout(null); 

     JRootPane wizardPanel = new JRootPane(); 
     wizardPanel.setBounds(10, 295, 545, 336); 
     wizardPanel.setLayout(null); 

     JLabel backgroundLabel; 
     try { 
      File f = new File("D:\\work\\eclipse\\workspace_eclipse_4.4.1\\trialExamples\\src\\main\\images\\nature.jpg"); 
      backgroundLabel = new JLabel(new ImageIcon(ImageIO.read(f))); 
      backgroundLabel.setBounds(0, 0, 545, 336); 
      wizardPanel.setContentPane(backgroundLabel); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     JButton btnNewButton = new JButton("New button"); 
     btnNewButton.setBounds(309, 95, 89, 23); 
     wizardPanel.getContentPane().add(btnNewButton); 

     JButton btnNewButton_1 = new JButton("New button"); 
     btnNewButton_1.setBounds(309, 150, 89, 23); 
     wizardPanel.getContentPane().add(btnNewButton_1); 

     JButton btnNewButton_2 = new JButton("New button"); 
     btnNewButton_2.setBounds(309, 212, 89, 23); 
     wizardPanel.getContentPane().add(btnNewButton_2); 

     homePanel.add(wizardPanel.getContentPane()); 

     add(homePanel); 
+0

Ama buna ek olarak sol tarafta iki tane daha panel kullanıyorum! Sadece görüntünün ilk panelde görüntülenmesini istiyorum. – Lingaraj

+1

@Lingaraj Ben bir JPanel içinden bir JRootPane kullanmak için düzenlenmiş. Bu doğru ve işe yarıyor olsa da, bunu yapmak için iyi bir yol değil. PaintComponent yönteminin geçersiz olduğu bir genişletilmiş JPanel kullanmalısınız. Ayrıca [Düzen yöneticileri] kullanmak için iyi bir uygulamadır (https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html) daha iyi bir çözüm 'null' düzenleri ile itimat etmemek olacaktır –

+2

: P – MadProgrammer

2

Bu etiketin üzerine düğmesi yerleştirmek kötü bir fikirdir çalışma var. Daha iyi bir yol, görüntüyü panel arka planı olarak boyamak veya JLayer'i kullanmaktır. İşte ilk çözüm için bir örnek:

import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.LayoutManager; 
import java.util.Objects; 

import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 

public class JImagePanel extends JPanel { 

    private final Image image; 

    private boolean scale; 

    public JImagePanel(Image anImage) { 
     image = Objects.requireNonNull(anImage); 
    } 

    public JImagePanel(Image anImage, LayoutManager aLayout) { 
     super(aLayout); 
     image = Objects.requireNonNull(anImage); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     final Image toDraw = scale? image.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH) : image; 
     g.drawImage(toDraw, 0, 0, this); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } else { 
      return new Dimension(image.getWidth(this), image.getHeight(this)); 
     } 
    } 

    public boolean isScale() { 
     return scale; 
    } 

    public void setScale(boolean scale) { 
     this.scale = scale; 
    } 


    public static void main(String[] args) throws Exception { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        final JImagePanel p = 
          new JImagePanel(ImageIO.read(JImagePanel.class.getResource("myImage.png")), new FlowLayout()); 
        p.setScale(true); 
        p.add(new JButton("Button")); 
        final JFrame frm = new JFrame("Image test"); 
        frm.add(p); 
        frm.pack(); 
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
        frm.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

} 
+0

* "Düğmenin üzerine etiket koymak kötü bir fikir" * - Neden? En az bir özel sebep için tercih ettiğim yöntem değil, ancak bu iddiayı yapacaksanız OP'nin neden – MadProgrammer

+2

'image.getWidth (null)' nuzun görüntü olması gerektiğini bilmesi yararlı olacaktır. getWidth (this) 've getHeight' ve' g.drawImage (toDraw, 0, 0, null) 'için aynı şey' 'g.drawImage (toDraw, 0, 0, this)' ve [Görüntülerin Perils'i olmalıdır. .getScaledInstance()] (https://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html) neden getScaledInstance kullanamayacağımın nedenleri için: P – MadProgrammer

+2

Ayrıca, UI'nizi diğer potansiyel sorunların birçoğunu çözmek için EDT bağlamında yüklemeniz gerekir, [Başlangıç ​​Konuları] 'na bir göz atın (http://docs.oracle.com/javase/tutorial/uiswing /concurrency/initial.html) Daha fazla bilgi için – MadProgrammer