2013-02-21 58 views
1

JButtonJLabel在添加自定義背景時消失。我在程序中看不到任何問題,但也許你們找到了解決方案!我認爲這只是我忘了的一件事,但我無法弄清楚。JButton和JLabel在添加自定義背景時消失

下面的代碼:

GameWindow.java

setContentPane(new StartImagePanel(RollrackLogo)); 
out.println("adding JLWelcome"); 
JLWelcome.setText("Welcome to Rollrack, " + namewindow.name); 
add(JLWelcome); 
JLWelcome.setVisible(true); 
out.println("JLWelcome added"); 
out.println("adding JBRandom"); 
JBRandom.setText("Random"); 
add(JBRandom); 
JBRandom.setVisible(true); 
out.println("added JBRandom"); 

背景出現完美的,但不是JButtonJLabel

代碼發送到StartImagePanel.java

public class StartImagePanel extends JComponent{ 
    private Image image; 
    public StartImagePanel(Image image) { 
     this.image = image; 
    } 
    @Override 
    protected void paintComponent(Graphics g) { 
     g.drawImage(image, 0, 0, null); 
    } 
} 
+0

'setContentPane(new StartImagePanel(..'爲了更好的幫助更快,發佈[SSCCE](http://sscce.org/)。對於圖像,只需在代碼中創建一個,如[本答案] (http://stackoverflow.com/questions/14979647/background-image-hides-all-gui-design-components/14980180#14980180)。 – 2013-02-21 13:10:55

+0

很快看到SSCCE的任何機會,或者你是否打算浪費更多的時間強迫人們猜測爲什麼代碼被破壞? – 2013-02-21 13:38:48

+0

對不起,但我不知道做什麼,使這個SSCCE – joapet99 2013-02-21 13:54:08

回答

2

你的按鈕和標籤添加到您的GameWindow框架,而他們應該被添加到其的contentPane,而不是setContentPane(new StartImagePanel(RollrackLogo));。這就是爲什麼他們沒有顯示,他們被添加到框架。

做一個變量StartImagePanel並添加按鈕和標籤,它們應該顯示出來。

StartImagePanel contentPanel = new StartImagePanel(RollrackLogo); 
setContentPane(contentPanel); 

... 

out.println("adding JLWelcome"); 
JLWelcome.setText("Welcome to Rollrack, " + namewindow.name); 
contentPanel.add(JLWelcome); 
JLWelcome.setVisible(true); 
out.println("JLWelcome added"); 
out.println("adding JBRandom"); 
JBRandom.setText("Random"); 
contentPanel.add(JBRandom); 
JBRandom.setVisible(true); 
out.println("added JBRandom"); 

回答爭議

第一款的說法是完全錯誤的。這是證明它的來源。自定義面板的代碼被賦予

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class AddToCustomContentPane { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       // the GUI as seen by the user (without frame) 
       JPanel gui = new JPanel(new FlowLayout()); 
       gui.setBorder(new EmptyBorder(2, 3, 2, 3)); 
       gui.setBackground(Color.RED); 

       JFrame f = new JFrame("Demo"); 
       f.setContentPane(gui); 

       // Acid test. Can we add buttons direct to the frame? 
       f.add(new JButton("Button 1")); 
       f.add(new JButton("Button 2")); 

       // Ensures JVM closes after frame(s) closed and 
       // all non-daemon threads are finished 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       // See http://stackoverflow.com/a/7143398/418556 for demo. 
       f.setLocationByPlatform(true); 

       // ensures the frame is the minimum size it needs to be 
       // in order display the components within it 
       f.pack(); 
       // should be done last, to avoid flickering, moving, 
       // resizing artifacts. 
       f.setVisible(true); 
      } 
     }; 
     // Swing GUIs should be created and updated on the EDT 
     // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html 
     SwingUtilities.invokeLater(r); 
    } 
} 

編輯後下面是工程上顯示黑色圖像的背景既按鈕和標籤的一個片段,我刪除了不需要的(聽衆)。

public static void main(String[] v) { 

class StartImagePanel extends JPanel { 
    private Image image; 
    public StartImagePanel(Image image) { 
     this.image = image; 
    } 
    @Override 
    protected void paintComponent(Graphics g) { 
    g.drawImage(image, 0, 0, null); 
    } 
} 

class GameWindow extends JFrame{ 
    public GameWindow() { 
    BufferedImage RollrackLogo; 
    RollrackLogo = new BufferedImage(400,200,BufferedImage.TYPE_INT_RGB); 
    final JButton JBRandom = new JButton(); 
    final JLabel JLWelcome = new JLabel(); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    StartImagePanel panel = new StartImagePanel(RollrackLogo); 
    setContentPane(panel); 
    setExtendedState(MAXIMIZED_BOTH); 
    setVisible(true); 
    JLWelcome.setText("Welcome to Rollrack"); 
    panel.add(JLWelcome); 
    JLWelcome.setVisible(true); 
    JBRandom.setText("Random"); 
    panel.add(JBRandom); 
    JBRandom.setVisible(true); 
    } 
} 

GameWindow window = new GameWindow(); 
window.pack(); 
window.setVisible(true); 
} 

+0

我試過了,它什麼都沒做......我想!如果背景不透明,是否有話要說? – joapet99 2013-02-21 13:32:58

+2

請參閱**之後的修改答案爭議**,瞭解我爲什麼不同意您的技術要點。請注意,這可能會更好地處理一個單獨的問題,但以簡單的方式。你錯了。即使在設置了自定義內容窗格後,如果我們向框架添加了組件,只要它具有適當的佈局,它們就會在自定義內容窗格中結束。這導致我重複到OP ..(這次稍微大聲一點)*爲了更好地幫助,請發佈[SSCCE](http://sscce.org/)。* – 2013-02-21 13:37:26

+0

哦。我如何創建SSCCE? – joapet99 2013-02-21 13:45:22

1

我寧願用一個實例JFrame的,而不是擴大它,因爲@Andrew湯普森在另一個問題建議。
但是,如果要擴展它,在構造函數中調用super()可能是一個好習慣。

此外,我們可能需要知道您的StartImagePanel發生了什麼。
對我來說,似乎是這個問題。

  1. 保證雙方的GameWindowStartImagePanel適當延長其超類(叫​​)。
  2. 確保您的StartImagePanel擁有合適的Layout
  3. 添加您的組件之前您設置您的框架可見。這也意味着你將不需要0​​。
  4. 確保您的代碼在EDT中執行(Event-Dispatch Thread)。

例子:

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class GameWindow extends JFrame{ 
    BufferedImage rollrackLogo; 
    JButton jbRandom; 
    JLabel jlWelcome; 

    public GameWindow() { 
     super(); 
     jbRandom = new JButton("Random"); 
     jlWelcome = new JLabel("Welcome to Rollrack, " + 
       namewindow.name); 

     rollrackLogo = new BufferedImage(400, 200, 
       BufferedImage.TYPE_INT_RGB); 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setContentPane(new StartImagePanel(rollrackLogo)); 

     // Add your components. 
     add(jlWelcome); 
     add(jbRandom); 

     addKeyListener(new KeyListener() { 
      @SuppressWarnings("static-access") 
      @Override 
      public void keyPressed(KeyEvent e) { 
       if(e.getKeyCode() == e.VK_ESCAPE){ 
        System.exit(7); 
       } 
      } 

      @Override 
      public void keyReleased(KeyEvent arg0) {} 

      @Override 
      public void keyTyped(KeyEvent arg0) {} 
     }); 

     // Pack, or otherwise set fullscreen. 
     pack(); 

     // Now, set frame visible. 
     setVisible(true); 
    } 
} 

編輯:現在你已經發布的代碼爲您StartImagePanel,我看到你正在擴大JComponent。按照我以前的建議,(請致電super),設置一個Layout,並擴展JPanel