2016-04-06 24 views
2

画像を背景としてJPanelを作った。しかし、最初にJPanelを読み込んでいる間は、追加されたコンポーネントの残りの部分は表示されません。画像の上にマウスを置くと、ボタンが見えるようになります。パネルをロードするときに画像と一緒に背景としてJButtonsを表示する方法。ここで画像を背景としてJPanelでJButtonを表示する方法

enter image description here

私のコードの一部です:

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

すべてのコンポーネントが追加されると、コンテンツペインで 'revalidate()'と 'repaint()'を呼び出すようにしてください。可能であれば – Berger

+0

を入力し、コード全体を記入してください。 –

+1

[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)があればよいでしょう。これは、あなたの質問をもっと簡単に答えさせるでしょう。 – Tiz

答えて

0

これはクレイジーです!私はそれがラベルの上にボタンを配置するために、悪い考えです.....それが動作画像装填部上記JButtonが初期化コードブロックを配置することによって、それが働いて

 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

コンポーネントを重なり合わせるのは悪い考えです。より良い方法は、画像を背景としてペイントすることです。 –

+0

@SergiyMedvynskyy ...それは本当に意味をなさないが、私たちはいつも互いの上にコンポーネントを置く。それはすべてのことがどう機能するかのようなものだ...イメージをペイントする場合、それをペイントしてください(できれば 'JPanel')...でも、同じ種類の物です。 – MadProgrammer

+0

@MadProgrammerあなたが正しいです。私はラベルの上にボタンを置くことは悪い考えであることを意味しました。 –

1

迅速な解決に直接画像にJFrameコンテンツペインを設定し、このJFrameのコンテンツ・ペインに、コンポーネントを追加することがあります。コードがJFrameクラスの本体であると仮定します。私の提案は多かれ少なかれ次のようになります:

 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

それに加えて、私は左側にもう2つのパネルを使用しています!私は、最初のパネルに画像を表示したいだけです。 – Lingaraj

+1

@Lingaraj JPanel内からJRootPaneを使用するように編集しました。これは正しいものではありますが、これを行うには良い方法ではありません。 paintComponentメソッドがオーバーライドされている拡張JPanelを使用する必要があります。また、[Layout managers](https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)を使用することをお勧めします。 –

+2

より良い解決策は 'null'レイアウトに依存しないことです:P – MadProgrammer

2

を得ました。より良い方法は、画像をパネルの背景としてペイントするか、JLayerを使用することです。

+0

*「ラベルの上にボタンを置くのは悪い考えです」* - なぜですか?少なくとも1つの具体的な理由で私の好みの方法ではありませんが、あなたが主張するつもりならば、OP377はなぜ – MadProgrammer

+2

'image.getWidth(null)'が 'imageであるべきかを知ることは有益でしょう。 getHeight'と 'g.drawImage(toDraw、0、0、null)'と同じことは 'g.drawImage(toDraw、0、0、this)'と[Image Perils .getScaledInstance'を使用しない理由については、.getScaledInstance()](https://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html)を参照してください。 P – MadProgrammer

+2

その他の潜在的な問題を解決するには、EDTのコンテキスト内からUIを読み込む必要があります。[初期スレッド](http://docs.oracle.com/javase/tutorial/uiswing /concurrency/initial.html)詳細については – MadProgrammer

関連する問題