Domanda

Sto facendo una griglia semplice che ogni quadrato è evidenziato dal cursore:alt text

Sono un paio di jpanel, mapgrid e sovrapposizioni all'interno di un jlayeredpane, con MapGrid in fondo. MapGrid si basa solo sull'inizializzazione la griglia, la sua vernice Metodh è:

public void paintComponent(Graphics g) {

    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            g2d.setColor(new Color(128, 128, 128, 255));
            g2d.drawRect(tileSize * j, i * tileSize, tileSize, tileSize);

        }
    }

Nell'overlay jpanel è dove si verifica l'evidenziazione, questo è ciò che viene ridipinto quando il mouse viene spostato:

    public void paintComponent(Graphics g) {

    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);


    g2d.setColor(new Color(255, 255, 128, 255));
    g2d.drawRect((pointerX/tileSize)*tileSize,(pointerY/ tileSize)*tileSize, tileSize, tileSize);

}

Ho notato che anche se lo strato di base (mapgrid) non viene ridipinto quando il mouse si muove, solo il livello di sovrapposizione trasparente, la performance è carente. Se do uno sfondo a Overlay Jpanel, è più veloce. Se rimuovo l'antializzazione di MapGrid, è anche un po 'più veloce.

Non so perché dare uno sfondo allo strato di overlay (e quindi, nascondendo il mapgrid) o disabilitando l'antialias nel mapgrid porta a prestazioni molto migliori.

C'è un modo migliore per farlo? Perché succede?

È stato utile?

Soluzione

Questi due post dei blog recenti di 37signals discutono come hanno ottenuto quel "scatto" nel nuovo basecamp:

Come Basecamp potrebbe essere così dannatamente velocemente senza usare molta ui-lato-lato

Come funziona la scadenza della cache basata sulla chiave

Altri suggerimenti

Se tutto il tuo mapgrid ha lo stesso colore, tira fuori il setColor dal loop. In questo momento ogni chiamata alla pittura è creare nuovi oggetti a colori.

Per fare ciò che dovresti fare affidamento sulla callback della finestra di dialogo per aprire un'altra finestra di dialogo.

Esempio:

var options = SP.UI.$create_DialogOptions();
options.width = 500;
options.height = 250;
options.url = "/_layouts/MyApplicationPage.aspx";
options.dialogReturnValueCallback = Function.createDelegate(null, modalDialogClosedCallback);
SP.UI.ModalDialog.showModalDialog(options);

function modalDialogClosedCallback(dialogResult, returnValue) {
    // Depending on what data you get in your 'result' param
    // your logic to open the new dialog goes here.
    var options = SP.UI.$create_DialogOptions();
    options.width = 500;
    options.height = 250;
    options.url = dialogResult;
    SP.UI.ModalDialog.showModalDialog(options);
}
.

Per assicurarsi che il modalDialogClosedCallback ottenga i dati necessari per aprire un nuovo modaldialog.Nella pagina dell'applicazione Aggiungi questo ai pulsanti Fare clic su Evento SP.UI.ModalDialog.commonModalDialogClose(dialogResult, returnValue).È un metodo che chiuderà il modaldialog e invierà i dati al parametro dialogReturnValueCallback impostato in options.

Esempio:

<asp:Button ID="btn" runat="server" OnClick="javascript:SP.UI.ModalDialog.commonModalDialogClose('/_layouts/test.aspx', 'Dialog closed')" Text="Open Test" />
.

Quindi nella propria passione, assicurati che dialogResult contiene l'URL per la nuova pagina da aprire nel nuovo modaldialog.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top