2016-04-18 18 views
0

私はボードゲームであるJavaプログラムを開発中です。私は、JPanelの背景に画像を割り当てる手助けが必要です。私が今持っているのは、クリックしてドラッグできるボードパーツです。JPanelの背景として画像を設定するには

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class ShapeMover { 

public ShapeMover() { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setTitle("Shape Mover"); 

    initComponents(frame); 

    frame.pack(); 
    frame.setVisible(true); 
} 

public static void main(String s[]) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new ShapeMover(); 
     } 
    }); 
} 

private void initComponents(JFrame frame) { 
    frame.getContentPane().add(new DragPanel()); 
} 
} 



class DragPanel extends JPanel { 

Rectangle rect = new Rectangle(0, 0, 20, 20); 
int preX, preY; 
boolean isFirstTime = true; 
Rectangle area; 
boolean pressOut = false; 
private Dimension dim = new Dimension(800, 666); 

public DragPanel() { 
    addMouseMotionListener(new MyMouseAdapter()); 
    addMouseListener(new MyMouseAdapter()); 
} 

@Override 
public Dimension getPreferredSize() { 
    return dim; 
} 

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

    Graphics2D g2d = (Graphics2D) g; 
    if (isFirstTime) { 
     area = new Rectangle(dim); 
     rect.setLocation(50, 50); 
     isFirstTime = false; 
    } 

    g2d.setColor(Color.black); 
    g2d.fill(rect); 
} 

boolean checkRect() { 
    if (area == null) { 
     return false; 
    } 

    if (area.contains(rect.x, rect.y, rect.getWidth(), rect.getHeight())) { 
     return true; 
    } 

    int new_x = rect.x; 
    int new_y = rect.y; 

    if ((rect.x + rect.getWidth()) > area.getWidth()) { 
     new_x = (int) area.getWidth() - (int) (rect.getWidth() - 1); 
    } 
    if (rect.x < 0) { 
     new_x = -1; 
    } 
    if ((rect.y + rect.getHeight()) > area.getHeight()) { 
     new_y = (int) area.getHeight() - (int) (rect.getHeight() - 1); 
    } 
    if (rect.y < 0) { 
     new_y = -1; 
    } 
    rect.setLocation(new_x, new_y); 
    return false; 
} 

private class MyMouseAdapter extends MouseAdapter { 

    @Override 
    public void mousePressed(MouseEvent e) { 
     preX = rect.x - e.getX(); 
     preY = rect.y - e.getY(); 

     if (rect.contains(e.getX(), e.getY())) { 
      updateLocation(e); 
     } else { 
      pressOut = true; 
     } 
    } 

    @Override 
    public void mouseDragged(MouseEvent e) { 
     if (!pressOut) { 
      updateLocation(e); 
     } else { 
     } 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     if (rect.contains(e.getX(), e.getY())) { 
      updateLocation(e); 
     } else { 
      pressOut = false; 
     } 
    } 

    public void updateLocation(MouseEvent e) { 
     rect.setLocation(preX + e.getX(), preY + e.getY()); 
     checkRect(); 

     repaint(); 
    } 
} 
} 
+0

をJPanelのサブクラスを作成してオーバーライドすることである(HTTP:/ /stackoverflow.com/questions/23665784/java-gui-background-image/23667373#23667373) – MadProgrammer

答えて

0

新しいJLabelを作成して、背景イメージを表示するフレームに追加します。 このようなもの:

JLabel lblNewLabel = new JLabel(""); 
    lblNewLabel.setIcon(new ImageIcon("C:\\Users\\Faisal\\Desktop\\New folder\\picture-1.thumbnail.png")); 
    lblNewLabel.setBounds(0, 0, 515, 367); 
    frame1.add(lblNewLabel); 

これは私のプロジェクトのコードです。

+0

[JLabelを背景画像コンポーネントとして使用しない理由(http://stackoverflow.com/questions/) 23665784/java-gui-background-image/23667373#23667373)。そして、あなたは 'setBounds'呼び出しが大好きです – MadProgrammer

+0

@MadProgrammer、ヘッドアップありがとう、私はJLabelを見て、Javaに新しいです。 –

0

JPanelの上に背景を設定するための適切な方法は、[I背景画像成分として `JLabel`を使用しない理由理由] paintComponentを

public ImagePanel extends JPanel { 
    Image im; 
    public ImagePanel(Image im) { 
    this.im = im; 
    } 

    void paintComponent(Graphics g) { 
    g.drawImage(im,0,0, getWidth(), getHeight(), this); 
    super.paintComponent(g); 
    } 
} 
+0

さて、これまでのところ、 'paintComponent'は' public'ではなく、 'super.paintComponent'を呼び出すべきです。' this'を 'ImageObserver'として渡すべきです(特に' Image' )、これはその比率に対してイメージ(IMHOひどく)をスケールすることになり、見た目が不快になります – MadProgrammer

関連する問題