2014-11-28 5 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을 사용해 보셨습니까? 기본 배경 대신 이미지를 표시하기 위해 JPanel의 paintComponent 메소드를 대체 할 수도 있습니다. – StairZ

+0

'JLabels '은 다른 것과 마찬가지로 구성 요소이므로 콘텐츠 창을 만들고 다른 구성 요소를 배치 할 수 있습니다. 최상위 구성 요소는 원할 경우 배경을 투명하게 유지해야 할 수 있습니다. (그들은 또한이 경우 opaqueness 계약에 복종해야한다). – kiheru

+0

JLayeredPane을 사용하지 않았지만 동일한 문제가 발생하지 않았습니까? 내가 전에 말했듯이 배경을 투명하게 설정하는 방법은 무엇입니까? –

답변

0

그래서 할 당신 불투명도를 사용하여이를 달성 할 수 있습니다. 이 패널에 추가 된 구성 요소 만 표시됩니다. 코드는 다음과 같습니다.

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

감사합니다! 나는 새로운 클래스를 만들고 슈퍼 메서드를 오버라이드 할 필요없이이를 수행하는 간단한 방법이 있다는 것을 알고있었습니다. 솔직히 말해서 자바 API에서 '투명도'와 '알파 색상'을 찾고 있었는데 단어 불투명도를 모두 잊어 버렸습니다. –

+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를 확인하려면 이미 배경으로 이미지가있는 JPanel에 있고 당신이 당신의 구성 요소와 그 위에 또 다른 패널을 추가하려면 다음

panel.setOpaque(false); 
+0

이전에 시도했지만 JTextArea를 추가하는 것과 같이 완전히 덮습니다. –

+1

1. 페인트를 paintComponent로 변경하십시오 (두 경우 모두). 2. pack()에 의해 초기 크기 조정이 누락되었습니다. 그렇지 않으면 툴바 만 있습니다. 3. 초기 스레드가 누락되었습니다 (오라클 자습서에서 더 많이 표시됩니다.) 4. (잠재적 인 upvotes가 대답) override getPreferredSize '내부 CPane 확장 JPanel', 5 g.drawImage (back, 0, 0, this); – mKorbel