2015-07-20 62 views
0

我有以下幾點:的JFrame與背景圖像和一個JPanel

public class Frame { 

public static void main(String[] args) { 

    JFrame frame = new JFrame("Frame Demo"); 

    Panel panel = new Panel();   

    frame.add(panel);   

    frame.setBounds(250,100,800,500); 
    frame.setVisible(true); 
} 
} 

public class Panel extends JPanel { 

JButton singlePlayerButton; 
JButton multiPlayerButton; 

BufferedImage image; 

Gui gui; 


public Panel() { 
    gui = new Gui(); 
    add(gui); 

    try { 
     image = ImageIO.read(new File("C:\\Users\\void\\workspace\\BattleShips\\src\\Testumgebung\\background\\battleship_main.jpg")); 

    } catch (IOException e) { 
     e.getMessage(); 
     e.printStackTrace(); 
    } 

} 

public void paintComponent(Graphics g) { 
    g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null); 
} 


JLabel text; 
JPanel mainMenuPanel; 


private class Gui extends JPanel { 

    public Gui() { 

    setVisible(true); 
    setSize(500, 300); 
    setLayout(null); 

    mainMenuPanel = new JPanel(); 

    mainMenuPanel.setLayout(null); 
    mainMenuPanel.setBackground(Color.BLUE); 
    mainMenuPanel.setBounds(150, 10, 200, 230); 
    add(mainMenuPanel); 
    mainMenuPanel.setVisible(true); 


    singlePlayerButton = new JButton("Single Player"); 
    singlePlayerButton.setBounds(100,50 , 150, 40); 

    singlePlayerButton.setVisible(true); 

    mainMenuPanel.add(singlePlayerButton); 

    multiPlayerButton = new JButton("Multi Player"); 
    multiPlayerButton.setBounds(100, 100, 150, 40); 

    multiPlayerButton.setVisible(true); 
    mainMenuPanel.add(multiPlayerButton); 

    repaint(); 
} 

} 
} 

我只想一個MainMenu用的BackgroundImage和按鈕像單人等我一定要設置一個佈局或是否有可能沒有之一。我剛開始使用GUI,你可以從代碼中假設。在此先感謝...

+1

首先,確保你叫super.paintComponent方法你做任何自定義塗裝前;其次,不要使用空白布局;第三步將GUI的一個實例添加到Panel中,確保使用setOpaque(false)將所有組件透明化, – MadProgrammer

回答

1

我一定要設置一個佈局或者是有可能沒有一個

根據經驗,一般情況下,是的,你應該利用佈局管理器的究竟在哪兒這是可能的,從長遠來看它會爲您節省大量的工作。

根據你的代碼,我想你想要做什麼,我會建議在看看:

至於其他建議:

  • 不要使用null佈局,像素完美的佈局是現代UI設計中的幻覺。影響組件的個體大小的因素太多,其中沒有一個可以控制。 Swing被設計爲與佈局經理一起工作,放棄這些將導致問題和問題的終結,你將花費越來越多的時間來嘗試糾正
  • 不要引用src有史以來,它不會存在一旦程序被導出。嘗試並避免絕對路徑,因爲不同的計算機會將您的程序放置在不同的位置(並非所有操作系統都有驅動器字母的概念)。相反,在你的情況下,你應該使用像getClass().getResource("/Testumgebung/background/battleship_main.jpg")
  • 你應該打電話super.paintComponent之前執行任何自定義繪畫作爲一般規則。
  • 爲了讓您的背景顯示出來,所有添加到它的組件都應該是透明的(setOpaque(false)),以便背景可以透過。
  • 將你的課程分爲責任區。例如Panel應做什麼,但管理的背景圖像和不應該被別人管理東西,這意味着具有Gui加入Panel作爲單獨的步驟,而不是Panel小號初始化的一部分

作爲一個概念例如...

Be free

import java.awt.AlphaComposite; 
import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Composite; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Frame { 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       Panel background = new Panel(); 

       JFrame frame = new JFrame("Testing"); 
       frame.setContentPane(background); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new Gui()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public static class Panel extends JPanel { 

     BufferedImage image; 

     public Panel() { 
      setLayout(new BorderLayout()); 
      try { 
       image = ImageIO.read(getClass().getResource("/Testumgebung/background/battleship_main.png")); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return image == null ? super.getPreferredSize() : new Dimension(image.getWidth(), image.getHeight()); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(image, 0, 0, this); 
     } 

    } 

    public static class Gui extends JPanel { 

     private MainMenuPane mainMenuPane; 
     private CardLayout cardLayout; 

     public Gui() { 

      setOpaque(false); 

      setVisible(true); 
      cardLayout = new CardLayout(); 
      setLayout(cardLayout); 

      mainMenuPane = new MainMenuPane(); 
      // Other views 

      add(mainMenuPane, "MainMenu"); 

      cardLayout.show(this, "MainMenu"); 

     } 

    } 

    public static class MainMenuPane extends JPanel { 

     JButton singlePlayerButton; 
     JButton multiPlayerButton; 

     JLabel text; 

     public MainMenuPane() { 

      setLayout(new GridBagLayout()); 
      setOpaque(false); 
      setBackground(Color.BLUE); 

      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.ipadx = 20; 
      gbc.ipady = 20; 

      singlePlayerButton = new JButton("Single Player"); 

      add(singlePlayerButton, gbc); 

      multiPlayerButton = new JButton("Multi Player"); 

      add(multiPlayerButton, gbc); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      // This is faking transparency, so the background color 
      // will be see through 
      Graphics2D g2d = (Graphics2D) g.create(); 
      Composite old = g2d.getComposite(); 
      g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f)); 
      g2d.fillRect(0, 0, getWidth(), getHeight()); 
      g2d.setComposite(old); 
     } 

    } 

}