2011-08-17 2 views
2

Java 패널에 사용자 이름/암호 필드가있는 로그인 양식이 있습니다.다른 구성 요소를 포함하는 패널에 배경 이미지 추가

이 로그인 양식 아래에 배경 이미지를 추가하고 싶습니다.

이것을 달성하는 가장 좋은 방법은 무엇입니까?

샘플 코드 제공을위한 추가 보너스. 알아보기 힘든 시간입니다. 내 머리의 상단에서

+2

음 ... 내가 시작해야합니까? 오, 그래, [여기 : http://tinyurl.com/so-hints](http://tinyurl.com/so-hints). 해당 링크를 읽으십시오. 그럼 다시 가서 다시 읽어주세요. 또한 당신이 말하고있는 기술에 대해 말하면, 우리는 당신을 도울 수 있을지도 모른다. (Swing, AWT, JSP, JSF, SWT? –

+0

http://stackoverflow.com/questions/5912913/how-can-i-put-a-jbutton-on-an-image – dacwe

+0

견본 코드 제공을위한 추가 보너스 만 제공하고 싶습니다. 힘들어합니다. 이 문제에 대한 답은 http://download.oracle.com/javase/tutorial/uiswing/components/dialog.html 및 http://download.oracle.com/javase/tutorial/uiswing/components/label에서 확인할 수 있습니다. html 및 http://download.oracle.com/javase/tutorial/uiswing/components/icon.html JLabel의 모든 JComponet에 대해 불투명 (false)을 설정하십시오. – mKorbel

답변

12

두 가지 옵션 :

  1. 재정의 아이-구성 요소를 그리기 전에 배경 이미지를 페인트 로그인 양식을 포함하는 패널의 페인트하는 방법.

  2. 는 다음

    1. 배경 이미지 패널 (이미지를 그립니다 paintCompanent 메소드를 오버라이드 (override)) 만들기 마십시오.
    2. 이 BorderLayout.CENTER와 배경 패널에 로그인 폼 패널을 추가,
    3. 는 로그인 양식을 포함하는 패널에 opaque(false) 설정의 BorderLayout이 패널의 레이아웃 매니저를 설정합니다. 두 번째 방법의

데모 :

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

class BgPanel extends JPanel { 
    Image bg = new ImageIcon("water.jpg").getImage(); 
    @Override 
    public void paintComponent(Graphics g) { 
     g.drawImage(bg, 0, 0, getWidth(), getHeight(), this); 
    } 
} 

class LoginPanel extends JPanel { 
    LoginPanel() { 
     setOpaque(false); 
     setLayout(new FlowLayout()); 
     add(new JLabel("username: ")); add(new JTextField(10)); 
     add(new JLabel("password: ")); add(new JPasswordField(10)); 
    } 
} 

public class FrameTestBase extends JFrame { 
    public static void main(String args[]) { 
     JPanel bgPanel = new BgPanel(); 
     bgPanel.setLayout(new BorderLayout()); 
     bgPanel.add(new LoginPanel(), BorderLayout.CENTER); 

     FrameTestBase t = new FrameTestBase(); 
     t.setContentPane(bgPanel); 
     t.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     t.setSize(250, 100); 
     t.setVisible(true); 
    } 
} 

enter image description here

+1

좋은 코드 +1, (기본 메소드는 invokeLated에 래핑되어야 함) – mKorbel

+0

흠 .. 나는 그것이 그렇게되어야한다는 것을 완전히 확신하지 못한다. UI를 구현하는 * setVisible (true) 호출입니다. (IIRC,'setVisible (true)','show'와'pack'만이 UI를 실현합니다. 그때까지는 UI 스레드에 아무 것도 할 필요가 없습니다) – aioobe

+0

마지막 두 코드 줄'pack (있는 경우 : -)'setVisible (true)'는 모든 경우에 래핑되어야하며,'drawImage' 메소드에서 – mKorbel

관련 문제