2013-04-27 1 views
1

위의 대화식 JPanel과 배경 이미지가있는 JDialog 프레임을 만들려고합니다. 이 컨텍스트에서 JDialog는 유닛을 선택하고 이동할 수있는 '전투'필드를 나타냅니다. 게임은 우주 기반이므로 우주선의 ArrayList와 방어 할 행성 객체가있을 것입니다.여러 개의 선택 가능한 이미지 항목을 사용하여 JDialog를 생성합니다.

paintconfig를 오버라이드하여 '행성'을 나타내는 거친 원을 그리지 만 표시 할 배경 JLabel 이미지를 가져올 수 없습니다. 그런 다음 배경 JLabel을 표시 할 수는 있지만 서클을 볼 수는 없습니다. 이상적으로, 나는 원을 각 우주선 유형의 실제 이미지로 바꾸고 행성 만의 고유 이미지로 바꾸고 싶습니다. 이 방법을 사용하면 JDialog/JLayered/Customer JPanel을 사용하는 것보다 다른 방법을 사용할 수 있습니다. 나는 이것을 셀 수있는 것보다 더 많은 시간 동안 작업 해왔다.

나는 JDialog를 생성하고, JLayeredPane을 추가하고, 배경에 JLabel을 설정했다. JLabel 위에있는 JLayeredPane에 추가되는 JPanel을 확장하는 사용자 정의 클래스를 작성했습니다.이 클래스는 행성과 유닛에 대한 원을 그립니다.

enter image description here

나는 JPanel의를 선택하는 이유는 그래서 플레이어가 선택 (지구 자원을 추가하는) 또는 (이동 및 공격) 선박 있는지 결정하기 위해 마우스 이벤트를 확인할 수 있습니다. 나는이 간단한 확장 작성한 JPanel의 사용자 정의에 대한

:

public class SectorPnl extends javax.swing.JPanel implements MouseInputListener, ActionListener { 

private int     circleY, circleX, circleRadius; 
private Sector    sector; 
private Shape    planetShape; 
private Shape    shipShape; 
private Ship    ship; 
private Planet    planet; 
private Invasion   inv; 
private ArrayList<ShipType> shipBuild; 

public SectorPnl(Sector sector, Invasion inv) 
{ 
    initComponents(); 

    this.sector = sector; 
    this.inv = inv; 
    this.planet = sector.getPlanet(); 
    shipBuild = new ArrayList(); 

    Timer update = new Timer(28, this); 
    update.start(); 

    if (sector.hasPlanet()) 
    { 
     circleRadius = (int) sector.getPlanet().getPlanetRadius(); 
     circleX = (int) sector.getPlanet().getPositionX(); 
     circleY = (int) sector.getPlanet().getPositionY(); 
     planetShape = new Ellipse2D.Double(circleX, circleY, circleRadius, 
       circleRadius); 
    } 
} 

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

    Graphics2D g2 = (Graphics2D) g; 

    if (planetShape != null) 
    { 
     g2.setColor(Color.red); 
     g2.fill(planetShape); 
     g2.draw(planetShape); 
    } 
    if (shipShape != null) 
    { 
     g2.setColor(Color.white); 
     g2.fill(shipShape); 
     g2.draw(shipShape); 
    } 
} 

그리고 이것은 JDialog를에 추가하는 라인입니다 :

sectorDlg.setTitle(sector.getName()); 

    sectorDlg.setVisible(true); 
    sectorDlg.setSize(800,800); 

    SectorPnl sectorPnl = new SectorPnl(sector, inv); 
    sectorPnl.addMouseListener(sectorPnl); 
    sectorPnl.addMouseMotionListener(sectorPnl); 

    sectorLayer.setLayer(sectorPnl, 100); 
    sectorLayer.setBounds(0, 0, 800, 800); 

답변

0

JLabel의 양을 표시하는 것이 가능 아이콘과 텍스트가 있지만 아이콘과 텍스트의 상대적 위치를 지정해야한다고 생각합니다.

ImageIcon icon = createImageIcon("images/middle.gif"); 
. . . 
label1 = new JLabel("Image and Text", 
        icon, 
        JLabel.CENTER); 
//Set the position of the text, relative to the icon: 
label1.setVerticalTextPosition(JLabel.BOTTOM); 
label1.setHorizontalTextPosition(JLabel.CENTER); 

오라클의 How to use labels에서 가져 왔습니다.

배경 및 전경색을 설정하려고하면 어떻게되는지 알 수 없습니다.

JPanel을 캔버스로 사용한 경우 더 좋을 것이라고 생각합니다. 원하는 위치에서 아이콘과 텍스트를 그렸습니다. JPanel에서 마우스 클릭을 처리 할 수 ​​있습니다.

0

나는 지금 배경 화면을 가지고 있는데, '배'와 '행성'이 그려져있다. 그래도 이미지를 클릭 할 때 마우스 이벤트를 선택하는 방법을 결정하려고합니다. 내가 initComponents 후이 라인을 추가 한 배경 문제를() 정정

private Image    bgImage; 
    private Image    shipImage; 

;

나는 몇 가지 새로운 변수를 추가했습니다

ImageIcon ii = new ImageIcon(this.getClass().getResource("sector_Bg1.png")); 
    bgImage = ii.getImage(); 

나는 (.PNG 또는 .jpg 형식) 선박 아이콘을 추가뿐만 아니라 그들을 페인트 내의 paintComponent 방법을 변경했습니다.

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

    Graphics2D g2 = (Graphics2D) g; 
    Graphics2D g3 = (Graphics2D) g; 
    Graphics2D g4 = (Graphics2D) g; 

    g3.drawImage(bgImage, 0, 0, null); 

    if (planetShape != null) 
    { 
     g2.setColor(Color.red); 
     g2.fill(planetShape); 
     g2.draw(planetShape); 
    } 
    for (Ship s : sector.getShips()) 
    { 
     ImageIcon si = new ImageIcon(this.getClass().getResource("isd.png")); 
     shipImage = si.getImage(); 
     g3.drawImage(shipImage, (circleX + shipImage.getHeight(null)), circleY, null); 
    } 
} 

지금 .... 그려진 이미지 내에서 마우스 이벤트를 가져 오는 방법?

+0

'g3.drawImage (bgImage, 0, 0, null);은 (는)'g3이어야합니다.drawImage (bgImage, 0, 0, this); ' –

+0

* "지금 .... 그려진 이미지 내에서 마우스 이벤트를 선택하는 방법은?"이 게시물이이 질문에 대한 답이라면 다른 질문 일 것입니다. 이 게시물이 질문에 대한 답변이 아닌 * 경우, 정보는 [질문에 편집]해야합니다 (http://stackoverflow.com/q/16248935/418556). –

관련 문제