2014-02-07 4 views
2

저는 Java를 처음 사용하고 프로젝트에서 작업하기가 매우 쉽습니다. 내 메인 메뉴를 만들기위한 테스트로서, 나는 JFrame과 파워 랜저 사진을 실험 해왔다. 내 문제는 여러 번 시도해 보았고 내 창 왼쪽에 내 놀이 및 도움말 버튼을 가져 오는 데 많은 시간을 소비했기 때문입니다. 나는 4의 눈금을 만들고 빈 레이블을 넣으려고했지만 그냥 작동하지 않습니다. 이 내 코드입니다 :JFrame에서 배경 이미지를 가질 때 JButton을 왼쪽으로 이동

package be.kdg.AngryTanksKlad; 

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.io.IOException; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class Main { 
    public static void main(String[] args) throws IOException { 
     final Image image = ImageIO.read(new URL("http://www.modernmom.com/sites/default/files/images/Power%2BRangers%2BPowerRangersMMPR.jpg")); 
     final JFrame frame = new JFrame(); 
     frame.add(new ImagePanel(image)); 
     frame.setSize(800, 600); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
    } 




@SuppressWarnings("serial") 
class ImagePanel extends JPanel { 
    private Image image; 
    private boolean tile; 
    private JPanel menu = new JPanel(new FlowLayout(FlowLayout.LEFT)); 

    ImagePanel(Image image) { 
    this.image = image; 
    this.tile = false; 
    final JButton play = new JButton("PLAY"); 
    final JButton help = new JButton("HELP"); 
    final JLabel empty = new JLabel(); 
    } 

    menu.setLayout(new GridLayout(4,4)); 

    menu.add(empty); 
    menu.add(play); 
    menu.add(help); 
    add(menu,BorderLayout.CENTER); 
    menu.setOpaque(false); 

    setVisible(true); 
}; 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    if (tile) { 
     int iw = image.getWidth(this); 
     int ih = image.getHeight(this); 
     if (iw > 0 && ih > 0) { 
      for (int x = 0; x < getWidth(); x += iw) { 
       for (int y = 0; y < getHeight(); y += ih) { 
        g.drawImage(image, x, y, iw, ih, this); 
       } 
      } 
     } 
    } else { 
     g.drawImage(image, 0, 0, getWidth(), getHeight(), this); 
    } 
    } 
} 

enter image description here

+0

1) 빈칸 한 줄의 공백은 소스 코드에서 항상 * 충분합니다. '{'또는'}'앞의 공백 행은 일반적으로 중복됩니다. 2) 추가 너비/높이로 최소 크기 및 (크기 조정이 가능한 경우) 표시되어야하므로 GUI의 ASCII 아트 (또는 간단한 그림이있는 이미지)를 제공하십시오. –

+0

.. 코드가 깔끔하게 컴파일되지 않습니다. : ( –

+0

미안 해요, 아직 자바 마법사가 아닙니다;) –

답변

3

이와 비슷한?

enter image description here

하는 코드의 주석을 참조하십시오.

import java.awt.*; 
import java.awt.image.*; 
import java.awt.event.ActionEvent; 
import java.io.IOException; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.*; 
import javax.swing.border.*; 

public class SillyNAmeForAMainClassGivenIHave100CalledMain { 

public static void main(String[] args) throws IOException { 
    final Image image = new BufferedImage(400,200,BufferedImage.TYPE_INT_RGB); 
    final JFrame frame = new JFrame(); 
    frame.add(new ImagePanel(image)); 
    //frame.setSize(800, 600); 
    frame.pack(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 
} 

@SuppressWarnings("serial") 
class ImagePanel extends JPanel { 
private Image image; 
private boolean tile; 
// add 5px spacing between buttons 
private JPanel menu = new JPanel(new GridLayout(4,4,5,5)); 

ImagePanel(Image image) { 
    super(new BorderLayout()); // default is FlowLayout! 
    this.image = image; 
    this.tile = false; 
    final JButton play = new JButton("PLAY"); 
    final JButton help = new JButton("HELP"); 

    menu.add(play); 
    menu.add(help); 

    JPanel buttonConstrain = new JPanel(new FlowLayout()); 
    // pad the top of it.. 
    buttonConstrain.setBorder(new EmptyBorder(20,5,5,5)); 
    buttonConstrain.setOpaque(false); 
    buttonConstrain.add(menu); 
    // it won't help to use a BorderLayout contraint when the default is FlowLayout! 
    // LINE_START = 'left' for left-to-right locales, right for the other 
    add(buttonConstrain,BorderLayout.LINE_START); 
    menu.setOpaque(false); 

    setVisible(true); 
} 

@Override 
public Dimension getPreferredSize() { 
    Dimension d = null; 
    if (image != null) { 
     d = new Dimension(image.getWidth(this), image.getHeight(this)); 
    } else { 
     d = new Dimension(600,400); 
    } 
    return d; 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    if (tile) { 
     int iw = image.getWidth(this); 
     int ih = image.getHeight(this); 
     if (iw > 0 && ih > 0) { 
      for (int x = 0; x < getWidth(); x += iw) { 
       for (int y = 0; y < getHeight(); y += ih) { 
        g.drawImage(image, x, y, iw, ih, this); 
       } 
      } 
     } 
    } else { 
     g.drawImage(image, 0, 0, getWidth(), getHeight(), this); 
    } 
    } 
} 
+0

아이가 당신을 위해 이미지를 핫 링크하기 위해 노력했으며 당신도 사용하지 않았습니까? WTH : D –

+0

@peeskillet 매우 느린 연결에서 처음 4-5 번 사용했는데 이미지 가져 오기 오류가 발생했습니다. 그 때 'screw this ..'라고 생각했을 때 새로운 BufferedImage (400,200, BufferedImage.TYPE_INT_RGB);' ';) –

+0

해답을 찾아 주셔서 대단히 감사합니다. 그것은 나를 많이 도왔다! : DI는 또한 중간 왼쪽으로 버튼을 얻기 위해 20에서 200의 emptyBorder 값을 조정했습니다.) 나는 그림을 게시 할 수 있었으면 좋겠지 만 몇 가지 영향력 포인트가 더 필요합니다. D –

2

"내 문제는 내가 너무 여러 번 시도하고 왼쪽으로 내 플레이와 내 도움 버튼을 얻으려고 노력에 많은 시간을 할애 한 것입니다 내 창의. "

  1. 랩 또 다른 JPanel
  2. 의 메뉴 리터를 설정 ayout 메인 ImagePanel ~ BorderLayout입니다.
  3. 새로운 JPanel

    JPanel panel = new JPanel(); 
    panel.setOpaque(false); 
    panel.add(menu); 
    setLayout(new BorderLayout()); 
    add(panel, BorderLayout.WEST); 
    

ImagePanel

  • setOpaque(false)BorderLayout.WEST에 새 JPanel 잘 작동 추가

    enter image description here

    import java.awt.*; 
    import java.io.IOException; 
    import java.net.URL; 
    import javax.imageio.ImageIO; 
    import javax.swing.*; 
    
    public class Main { 
    
        public static void main(String[] args) throws IOException { 
         final Image image = ImageIO.read(new URL("http://www.modernmom.com/sites/default/files/images/Power%2BRangers%2BPowerRangersMMPR.jpg")); 
         final JFrame frame = new JFrame(); 
         frame.add(new ImagePanel(image)); 
         frame.setSize(800, 600); 
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
         frame.setVisible(true); 
        } 
    } 
    
    @SuppressWarnings("serial") 
    class ImagePanel extends JPanel { 
    
        private Image image; 
        private boolean tile; 
        private JPanel menu = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
    
        ImagePanel(Image image) { 
         this.image = image; 
         this.tile = false; 
         final JButton play = new JButton("PLAY"); 
         final JButton help = new JButton("HELP"); 
         final JLabel empty = new JLabel(); 
    
    
         menu.setLayout(
           new GridLayout(4, 4)); 
    
         menu.add(empty); 
    
         menu.add(play); 
    
         menu.add(help); 
    
         JPanel panel = new JPanel(); 
         panel.setOpaque(false); 
         panel.add(menu); 
         setLayout(new BorderLayout()); 
         add(panel, BorderLayout.WEST); 
    
         menu.setOpaque(false); 
    
         setVisible(true); 
        } 
    
        @Override 
        public void paintComponent(Graphics g) { 
         super.paintComponent(g); 
         if (tile) { 
          int iw = image.getWidth(this); 
          int ih = image.getHeight(this); 
          if (iw > 0 && ih > 0) { 
           for (int x = 0; x < getWidth(); x += iw) { 
            for (int y = 0; y < getHeight(); y += ih) { 
             g.drawImage(image, x, y, iw, ih, this); 
            } 
           } 
          } 
         } else { 
          g.drawImage(image, 0, 0, getWidth(), getHeight(), this); 
         } 
        } 
    } 
    
  • 관련 문제