2014-11-28 9 views
1

Я хочу сделать фоновое изображение для игры, которую я разрабатываю, но я не могу найти правильный способ получить эффект, который я хочу, мне нужен фон, который можно увидеть за текстом и т. Д., В основном имея фоновое покрытие всего JFrame/JPanel не только для одного раздела макета (например, BorderLayout.Center). Я думаю, что это все равно, но если он делает это, как сделать фон для этих прозрачных, чтобы увидеть фон, который находится за ...Справка по фоновому изображению, JPanel, JFrame, что-нибудь?

Смущение я знаю, но я надеюсь, что кто-то здесь понимает, что я пытаюсь сделать, и могу помочь ... это мой текущий код. Я играл с фоном, поэтому не читал много о том, как я это написал.

import javax.swing.*; 
import javax.swing.border.*; 

import java.awt.*; 

public class GamePanel extends JPanel { 

private JTextPane playertext; 
private JTextField wealthstring, currentwealth; 

public GamePanel() { 

    super(); 
    setLayout(new BorderLayout()); 
    setBackground(Game.getBackgroundColor()); 
    Border raised = BorderFactory.createRaisedBevelBorder(); 
    Border lowered = BorderFactory.createLoweredBevelBorder(); 
    setBorder(BorderFactory.createCompoundBorder(new EmptyBorder(4, 4, 4, 4), (BorderFactory.createCompoundBorder(raised, lowered)))); 
    add(northpanel(), BorderLayout.NORTH); 
    add(eastpanel(), BorderLayout.EAST); 


} 


private JLabel northpanel() { 

    Font northfont = new Font("Engravers MT", Font.BOLD, 12); 
    ImageIcon banner = new ImageIcon("images/banner.png", "North Background"); 

    playertext = new JTextPane(); 
    playertext.setFont(northfont); 
    playertext.setEditable(false); 
    playertext.setText("Player: \n" + Game.getName()); 
    playertext.setBackground(Game.getBackgroundColor()); 
    playertext.setBorder(new EmptyBorder(10,10,10,10)); 

    wealthstring = new JTextField("Money: "); 
    wealthstring.setFont(northfont); 
    wealthstring.setEditable(false); 
    wealthstring.setHorizontalAlignment(wealthstring.RIGHT); 
    wealthstring.setBorder(null); 
    wealthstring.setBackground(Game.getBackgroundColor()); 

    currentwealth = new JTextField(); 
    currentwealth.setFont(northfont); 
    currentwealth.setEditable(false); 
    currentwealth.setHorizontalAlignment(wealthstring.RIGHT); 
    currentwealth.setBackground(Game.getBackgroundColor()); 
    currentwealth.setBorder(null); 
    String wealthrounded = String.format("%.2f", Game.getMoney()); 
    currentwealth.setText(wealthrounded); 

    JPanel wealthtext = new JPanel(); 
    wealthtext.setLayout(new GridLayout(2, 1)); 
    wealthtext.setBackground(Game.getBackgroundColor()); 
    wealthtext.setBorder(new EmptyBorder(10,10,10,10)); 
    wealthtext.add(wealthstring); 
    wealthtext.add(currentwealth); 

    JLabel northpanel = new JLabel(); 
    northpanel.setLayout(new BorderLayout()); 
    northpanel.setIcon(banner); 
    northpanel.add(new JSeparator(), BorderLayout.PAGE_END); 
    northpanel.add(playertext, BorderLayout.WEST); 
    northpanel.add(wealthtext, BorderLayout.EAST); 
    return northpanel; 
} 

private JPanel eastpanel() { 


    JButton tab1 = new JButton("Tab 1"); 
    JButton tab2 = new JButton("Tab 2"); 
    JButton tab3 = new JButton("Tab 3"); 

    JPanel easttabs = new JPanel(); 
    easttabs.setLayout(new GridLayout(1, 3)); 
    easttabs.add(tab1); 
    easttabs.add(tab2); 
    easttabs.add(tab3); 

    JPanel eastpanels = new JPanel(); 
    eastpanels.setLayout(new BorderLayout()); 
    eastpanels.setBackground(Game.getBackgroundColor()); 
    eastpanels.add(easttabs, BorderLayout.NORTH); 

    return eastpanels; 
} 

} 
+0

Вы пытались использовать JLayeredPane? Вы также можете переопределить метод paintComponent JPanel для отображения изображения вместо фона по умолчанию. – StairZ

+0

'JLabels' являются компонентами, как и любые другие, поэтому вы можете создать один из них и разместить другие компоненты. На верхних компонентах может потребоваться прозрачность их фона, если вы этого хотите. (В этом случае они также * должны подчиняться контракту непрозрачности). – kiheru

+0

Я не использовал JLayeredPane, но не имел бы такую ​​же проблему? и как я уже говорил, как бы установить фон в прозрачный? –

ответ

0

Так что, если у вас уже есть JPanel, который имеет свое изображение в качестве фона, и вы хотите добавить еще одну панель над ней с компонентами вы можно использовать Opacity для достижения этого. Только компоненты, добавленные в эту панель, будут видны. Вот код:

import java.awt.AlphaComposite; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JPanel; 

public class TransparentPane extends JPanel { 

    public TransparentPane() { 

     setOpaque(false); 

    } 

    @Override 
    protected void paintComponent(Graphics g) { 


     super.paintComponent(g); 


     Graphics2D g2d = (Graphics2D) g.create(); 

     g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0f)); 

     g2d.setColor(getBackground()); 
     g2d.fill(getBounds()); 

     g2d.dispose(); 

    } 

} 
+0

Спасибо! я знал, что есть простой способ сделать это, не создавая новый класс и не переопределяя супер методы. Честно говоря, я смотрел в java api для «прозрачности» и «альфа-цвета» забыл все о слове opaque. –

+0

Надеюсь, что это поможет, я должен был просто дать вам метод setOpaque, но я думал, что вам нужна полупрозрачная вещь, которую вы может достичь с классом я дал вам :) – StairZ

+0

в любом случае многое помогло. Я могу использовать регулируемую прозрачность для других вещей, теперь я знаю, как :) –

0

Создайте класс, который простирается от JPanel и по его методу рисования рисует над ним изображение. Теперь создайте класс, который простирается от JFrame, и в его конструкторе установите его contentpane для объекта этого класса JPanel, как показано ниже. Теперь вы можете добавить компоненты в jframe.

class SimpleTest extends JFrame { 

    JButton btn = new JButton("A Game"); 

    public SimpleTest() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setContentPane(new CPane()); 
     getContentPane().setBackground(Color.red); 
     getContentPane().add(btn, BorderLayout.NORTH); 
     setSize(new Dimension(300, 300)); 
     setVisible(true); 
    } 

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

class CPane extends JPanel { 

    Image back; 

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

     try { 
      back = ImageIO.read(getClass().getResource("back.jpg")); 
     } catch (Exception ex) { 
     } 
     g.drawImage(back, 0, 0, this); 
    } 
} 

Если вы хотите сделать JPanel прозрачным затем сделать

panel.setOpaque(false); 
+0

Я пробовал это раньше, но что-то вроде добавления JTextArea полностью закрывает его. –

+1

1. сменить краску на paintComponent (в обоих случаях), 2. пропустить начальную калибровку по pack(), в противном случае имеется только панель инструментов, 3. отсутствует начальный поток (больше в учебнике Oracle), 4. (для потенциальных повышений ответ) переопределить getPreferredSize 'внутри CPane расширяет JPanel', 5 g.drawImage (назад, 0, 0, это); – mKorbel