2017-11-30 4 views
0

저는 최근에 자바로 장난하고 있었고 저는 작은 게임을 개발하려고합니다. 문제는, 사용하고있는 JViewport가 갱신되지 않는다는 것입니다. 뷰포트에서 다시 그리기 메서드를 호출하면 뷰포트가 올바른 위치에서 깜박이고 뷰포트에 표시되는 전체 이미지가 배경에 그려지고 제대로 작동합니다. Viewport 전체를 그리는 것이 아니라 어떻게 뷰포트를 페인트합니까? 답변을위한 Thx;JViewPort를 업데이트하는 방법

public start() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Dimension my = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); 
     Rectangle myrec = new Rectangle(0,0,my.width, my.height); 
     setBounds(myrec); 
     this.setUndecorated(true); 

     JPanel Background = new JPanel(); 
     Background.setBounds(myrec); 
     Background.setLayout(null); 
     setContentPane(Background); 

     JScrollPane map = new JScrollPane(); 
     map.setBounds(0, 0, 3000, 3000); 
     map.setLayout(null); 

     //setContentPane(map); 

     gameoberflaeche MainMap = new gameoberflaeche(); 
     MainMap.setBounds(0,0, map.getWidth(), map.getHeight()); 
     MainMap.setup(); 
     map.add(MainMap); 

     Viewport currview = new Viewport(myrec, MainMap.player_1, map); 
     Background.add(currview); 
     //setContentPane(currview); 

     int delay = (1000/30); 
     ActionListener update = new ActionListener(){ 
      public void actionPerformed(ActionEvent evt) { 
       MainMap.Anfang.checkdead(); 
       //currview.stats.update(); 
       //currview.weaponpanel.update(); 
       //currview.MagPanel.update(); 
       currview.update(MainMap.player_1.field.x, MainMap.player_1.field.y); 

      } 
     }; 
     new Timer(delay, update).start(); 

    } 


     public class Viewport extends JViewport{ 
    Player myplayer; 
    statpanel stats; 
    Magazin MagPanel; 
    Waffenpanel weaponpanel; 
    Rectangle myrec; 

    public Viewport(Rectangle myrec, Player myp, JScrollPane myview) { 
     setView(myview); 
     reshape(0,0,myrec.width,myrec.height); 
    } 

    public void update(int x, int y) { 

    // System.out.println(getView()); 
     setViewPosition(new Point(x,y)); 
     System.out.println(x + " " + y + " " + getViewRect()); 
    } 

} 
+0

: 스크롤의 구성 요소를 업데이트하려면 당신이 모든 스크롤의 뷰포트에 구성 요소를 추가합니다. – MadProgrammer

답변

1
JPanel Background = new JPanel(); 

변수 이름은 대문자 문자로 시작하지 않아야합니다.

Background.setLayout(null); 

null 레이아웃을 사용하지 마십시오. Swing은 레이아웃 관리자와 함께 사용하도록 설계되었습니다.

JScrollPane map = new JScrollPane(); 
map.setLayout(null); 

JScrollPane에서는 null 레이아웃을 사용하지 마십시오. JScrollPane의 수평/수직 이동 막대, 행/열 헤더 및 내부 manange하는 레이아웃 매니저를 사용 뷰포트 등

Viewport currview = new Viewport(myrec, MainMap.player_1, map); 

새로운 뷰포트를 생성하지 않는다. 당신은뿐만 아니라`JScrollPane` 아마`JViewport`를 사용하여이 누락

scrollPane.getViewport().setView(...); 
+0

언급 한 내용이 변경되었지만 여전히 뷰포트가 이동하지 않습니다. scrollRectToVisible도 setViewPosition도 아니다. ViewRect를 디버깅하고 볼 때 새로운 위치로 업데이트됩니다. 당신의 도움을 주셔서 감사합니다! – Ragnaroek511

+0

당신은 많은 실수를했습니다. 모든 문제를 해결했는지는 알 수 없습니다. 문제를 나타내는 [mcve]를 게시하십시오. 다시 한 번 'MCVE'의 요점은 실제 프로그램이 아니라 질문의 맥락을 설명하는 것입니다. 그래서 당신은 왜 더 많은 뷰포트를 사용하지 않는지에 대해 질문합니다. 프레임과 스윙 구성 요소가있는 간단한 예제를 스크롤 창에 만드십시오. JTextArea를 추가 할 수 있습니다. 그런 다음 JButton을 추가합니다. 버튼을 클릭하면 뷰포트를 스크롤합니다. 기본 개념을 이해하면 실제 프로그램에 지식을 적용합니다. – camickr