2017-01-14 5 views
-5

alles klar Leute? Wie rende ich direkt auf dem Bildschirm in Java? Ich erinnere mich, dies zu tun SetPixel oder SetRGB, aber es gab eine Möglichkeit, Pixel des Haupt-JFrame und ZOrder noch vor MS-Windows-Komponenten setzen.Wie Rendern direkt Bildschirm in Java? JPanel render innerhalb JScrollPane

Hier Codes und eine Zip-Datei:

Mapa.java:

package com.primedi.ig; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.HeadlessException; 
import java.util.Timer; 
import java.util.TimerTask; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 

import com.primedi.matlog.C32; 
import com.primedi.tech.Arquivo; 

public class Mapa extends JFrame { 

    private static final long serialVersionUID = 1L; 
    public String nomeMapa = null; 
    private JPanel panMapa; 
    private JScrollPane brPanMapa; 

    public static Arquivo arqMapa = null; 

    Render r = null; 
    public Mapa(String nomeMapa){ 
     this.nomeMapa = nomeMapa; 

     inicializarJanela(); 

     try { 
      r = new Render(); 
      r.setBounds(658, 10, 640, 480); 
     } catch (HeadlessException e) { 
      e.printStackTrace(); 
     } 

     getContentPane().add(r); 
     setVisible(true); 
     processosCons(); 
    } 
    private void criarJanela(){ 
     //setTitle("zMeck - Início"); 
     setSize(1352, 594); 
     getContentPane().setLayout(null); 
     setResizable(false); 
     setLocationRelativeTo(null); 
     setUndecorated(true); 
     getContentPane().setBackground(Color.BLACK); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 
    private void criarPaineis(){ 
     panMapa = new JPanel(); 
     panMapa.setLayout(null); 
     panMapa.setBackground(Color.BLACK); 
    } 
    private void criarBarrasDeRolagem(){ 
     brPanMapa = new JScrollPane(panMapa); 
     brPanMapa.setBounds(0, 0, 658, 498); 
     brPanMapa.getHorizontalScrollBar().setUnitIncrement(32); 
     brPanMapa.getVerticalScrollBar().setUnitIncrement(32); 

     arqMapa = new Arquivo("mapas", "teste.pmp"); 
     arqMapa.carregarArquivo(); 
     Dimension d = new Dimension((arqMapa.linhas.get(0).length() * 32), arqMapa.linhas.size() * 32); 
     panMapa.setPreferredSize(d); 
    } 
    private void adicionarComponentes(){ 
     getContentPane().add(brPanMapa); 
    } 
    private void inicializarJanela(){ 
     criarJanela(); 
     criarPaineis(); 
     criarBarrasDeRolagem(); 
     adicionarComponentes(); 
     //carregarInfosMapa(); 
    } 
    /*private void carregarInfosMapa(){ 
     arqMapa = new Arquivo("mapas", nomeMapa + ".pmp"); 
     arqMapa.carregarArquivo(); 
     Dimension d = new Dimension((arqMapa.linhas.get(0).length() * 32), arqMapa.linhas.size() * 32); 
     panMapa.setPreferredSize(d); 
     panMapa.setVisible(true); 
     for(int j = 0; j < alcanceY; j++){ 
      for(int i = 0; i < alcanceX; i++){ 
       tilesImaginarios[i][j] = new JLabel(new ImageIcon("tiles/tile0.PNG")); 
       tilesImaginarios[i][j].setBounds((i * 32) + 658, j * 32, 32, 32); 
       getContentPane().add(tilesImaginarios[i][j]); 
      } 
     } 
    }*/ 

    public static int start = 0; 
    private void processosCons(){ 
     Timer t = new Timer(); 
     t.schedule(new TimerTask() { 
      int posInicialScrollX = 0; 
      int posInicialScrollY = 0; 

      public void run() { 
       if(start == 0){ 
        start = 1; 
       } 

       if(brPanMapa.getViewport().getViewPosition().x != posInicialScrollX){ 
        posInicialScrollX = brPanMapa.getViewport().getViewPosition().x; 

        Render.OFFSET_X = C32.pixelPara32(posInicialScrollX); 
        r.repaint(); 
        return; 
       } 

       if(brPanMapa.getViewport().getViewPosition().y != posInicialScrollY){ 
        posInicialScrollY = brPanMapa.getViewport().getViewPosition().y; 
        System.out.println("hello"); 
        Render.OFFSET_Y = C32.pixelPara32(posInicialScrollY); 
        r.repaint(); 
        return; 
       } 
      } 
     }, 33, 33); 
    } 
} 

Render.java:

package com.primedi.ig; 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.HeadlessException; 
import java.awt.Image; 
import java.awt.Toolkit; 

import javax.swing.JPanel; 

import com.primedi.tech.Arquivo; 

public class Render extends JPanel { 
    private static final long serialVersionUID = 1L; 

    public static int OFFSET_X = 0; 
    public static int OFFSET_Y = 0; 

    public Render() throws HeadlessException { 
     super(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     if(Mapa.start == 1){ 
      Graphics2D g2d = (Graphics2D)g; 

      Arquivo arq = new Arquivo("mapas", "teste.pmp"); 
      arq.carregarArquivo(); 
      for(int j = 0; j < 15; j++){ 
       for(int i = 0; i < 20; i++){ 
        System.out.println(OFFSET_X); 
        Image img1 = Toolkit.getDefaultToolkit().getImage("tiles/tile" + "" + arq.linhas.get(j + OFFSET_Y).charAt(i + OFFSET_X) + ".PNG"); 
        g2d.drawImage(img1, i * 32, j * 32, this); 
       } 
      } 
     } 
    } 
} 

C32.java:

package com.primedi.matlog; 

public class C32 { 
    public static int pixelPara32(int pixelV){ 
     int aprox = 0; 
     int finalx = 0; 
     for(aprox = 0; aprox < pixelV; aprox++); 
     for(int i = 0; i < aprox; i = i + 32){ 
      finalx++; 
     } 
     return finalx; 
    } 
} 

Arquivo.java:

package com.primedi.tech; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 

public class Arquivo { 

    public ArrayList<String> linhas = new ArrayList<String>(); 

    public String pasta; 
    public String arquivo; 

    public Arquivo(String pasta, String arq){ 
     this.pasta = pasta; 
     arquivo = arq; 
    } 

    public void carregarArquivo(){ 
     File file = new File(pasta + "/" + arquivo); 

     BufferedReader br; 
     try { 
      br = new BufferedReader(new FileReader(file)); 

      String linha; 
      while ((linha = br.readLine()) != null) { 
       linhas.add(linha); 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Wenn ich die JPanel Platz machen innen JScrollBar einsetzen, ist es Fehler in den Prozess machen, bevor Bild Gesamtlasten einen schwarzen backgroud von JScrollPane erscheint, lächerlich.

Kann mir helfen? Vielen Dank, Leute.

hier ein * .zip Wenn Sie es besser zum Download bereit: https://expirebox.com/download/2b20ec8e44084c19d8bf1676d135d024.html

Es gibt keine Möglichkeit, diesen Platz auf dem Bildschirm reservieren zu machen?

Der Fehler: bug

+0

Dies hat nichts mit Rendering speziell zu tun und alles mit Threading zu tun. Ihr Code scheint Swing-Threading-Regeln vollständig zu ignorieren. Wenn also lange Prozesse ausgeführt werden, wird kein Rendering ausgeführt. Ihr vorgeschlagenes "fix" - direktes Rendern ist ein [XY-Problem] (http://mywiki.wooled.org/XyProblem) - eine falsche Lösung für das Problem. –

+0

Vorgeschlagene Lösung: Nachschlagen und einen SwingWorker verwenden. –

+0

ok, sorry guy, ich werde diesen Thread optimieren –

Antwort

-1

Erhöhen "brPanMapa.getComponent (0) .setVisible (false);" bei "criarBarrasDeRolagem()"

mein Code weiterhin schnell, render 32x32 Kachel basierte Karte sehr schnelle Geschwindigkeit!

Ich weiß nicht, wie ich diese Codezeile erraten, nach 5h!

+0

Das ist die echte Lösung, mein Code geht schnell weiter. –

+0

Wer anders als die Lösung verweigert? Welche Idiotie. –

0

Werfen Sie einen Blick auf die BufferStrategy Klasse.

Es ist auch eine schlechte Idee, etwas anderes als das Zeichnen in paintComponent zu machen. Das Laden von Bildern ist aufgrund von Datenträger-E/A langsam. Wenn möglich, laden Sie sie vorher und speichern Sie sie im Speicher.

+0

1) Dies ist ein AWT-Fix. 2) Dies wird seine Threading-Probleme überhaupt nicht beheben. –

Verwandte Themen