2014-06-18 2 views
0

다시 나타납니다. GUI에서 이미지 위에 버튼을 놓는 방법에 대해 궁금합니다. 여기에 내 현재 코드 :이미지 위에 버튼을 놓습니다.

private static JPanel titlePanel = new JPanel(); 
    private static JLabel titleScreen = new JLabel(); 
    private static JLabel titleScreenBackground = new JLabel(); 
    private static JButton startGameButton = new JButton("START GAME"); 
    private static ImageIcon titleScreenPic = new ImageIcon("http://icdn6.digitaltrends.com/image/battleship-650x0.jpg"); 
    private static JFrame frame=new JFrame(); //creates frame 

    public static void main(String[] args) throws MalformedURLException{ 
      titleScreen(); 
    } 

    public static void titleScreen() throws IOException{ 

     titleScreen.setLayout(new GridBagLayout()); 
     titlePanel.setLayout(new GridBagLayout()); 

     GridBagConstraints c1 = new GridBagConstraints(); 
     c1.gridx = 0; 
     c1.gridy = 0; 
     c1.anchor = GridBagConstraints.PAGE_END; 

     titleScreenBackground.setIcon(titleScreenPic); 

     titlePanel.add(startGameButton); 

     titlePanel.setAlignmentY(SwingConstants.BOTTOM); 
     frame.add(titleScreenBackground); 
     frame.add(titlePanel); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(630, 300); //sets appropriate size for frame 
     frame.setVisible(true); //makes frame visible 
    } 

내가 GridBagLayout로 그래서 난 같은 셀에 구성 요소를 배치 할 수있는 패널을 만들려고하지만, 여전히 그것을 바로 옆에 첫번째 후 버튼을 이미지를 배치합니다.

편집 : 코드를 다시 작성하여 원하는대로 처리했습니다. 보시다시피 단추의 위치를 ​​설정하려고하는 선은 단추에 아무 것도하지 않습니다.

+0

가능한 [중복] (http://stackoverflow.com/q/10861852/230513). – trashgod

+0

좋아, 나는 이미지에 버튼을 배치 관리,하지만 지금은 할 수 없습니다 그것들을 정렬합니다. 버튼에 .setAlignmentY를 사용하고 있는데, 여전히 가운데 상단에 있습니다. – user3741402

+0

@ user3741402, 적절한 레이아웃 관리자를 사용하면 BorderLayout이 가장 쉽고 코드를 업데이트하여 변경 사항을 볼 수 있습니다. – camickr

답변

4

GUI의 이미지 위에 버튼을 배치하는 방법을 설명합니다.

이미지 위에 스윙 버튼을 배치하려면 2 단계를 따라야합니다.

  1. 이미지가 포함 된 레이블에 대한 레이아웃 관리자를 설정하십시오.

  2. 레이블 (패널이 아님)에 단추를 추가하십시오.

자세한 내용과 예제는 Background Panel을 참조하십시오.

편집 : 방금 인 JPanel의 페인트 방법에 이미지를 사용할 수있는 이미지 버튼을 원하는 경우

label.setLayout(new GridBagLayout()); 
label.add(button, new GridBagConstraints()); 
+0

원래 코드가 아이콘을 JLabel에 추가했습니다.왜 그 코드를 변경 했습니까? 왜 판넬에 주문 페인트를하고 있니? – camickr

+0

이 코멘트는 저에게 맞습니까? – user3741402

+0

@ user3741402, 네, 게시 한 원본 코드에 대한 내 제안을 간과하고있는 것 같습니다. 당신은 이런 식으로 복잡하게 만들고 있습니다. 단추를 레이블 (아이콘 포함)에 추가하고 레이블을 프레임에 추가하면됩니다. 핵심은 구성 요소를 표시하려면 JPanel에 레이아웃 관리자가 필요한 것처럼 레이아웃에 레이블이 필요하다는 것입니다. – camickr

-1

:

가장 쉬운 방법은 구성 요소를 중심합니다. 예 (자원 메신저와

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.GridBagLayout; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class TestFrame extends JFrame { 

BackgroundPane bgPane; 

private JButton startButton; 

public TestFrame() { 
    super(); 
    initComponents(); 
} 

private void initComponents() { 

    try { 

     URL url = getClass().getResource("battleship-650x0.jpg"); 
     BufferedImage image = ImageIO.read(url); 

     bgPane = new BackgroundPane(image); 
     bgPane.setLayout(new GridBagLayout()); 
     startButton = new JButton("Start"); 
     bgPane.add(startButton); 
     setContentPane(bgPane); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    TestFrame frame = new TestFrame(); 
    frame.setVisible(true); 
} 

class BackgroundPane extends JPanel { 
    Image image; 

    public BackgroundPane(Image backGroundImage) { 
     super(); 
     image = backGroundImage; 
     setPreferredSize(new Dimension(image.getWidth(this), image.getHeight(this))); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 0, 0, null); 

    } 

} 
} 
+0

-1, paint() 메소드를 재정의 할 필요는 없습니다. setPreferredSize() 메서드를 사용하면 안됩니다. 대신에 당신은'getPreferredSize()'메소드를 오버라이드한다. 이것은 이미 회화가 어떻게되는지를 설명하는'BackgroundPanel'에 대한 링크에서 5 시간 더 일찍 제안되었습니다. – camickr

+0

'getPreferredSize()'와'setPreferredSize()'size는'Dimension' 객체의 getter 및 setter 메소드입니다. 그래서'getPreferredSize()'를 오버라이드하고'setPreferredSize()'를 사용하는 것이 효과적이라고 생각합니다. –

관련 문제