2016-04-11 13 views
0

Ich versuche, etwas ähnliches wie "Spiel des Lebens" mit JPanel zu tun, das Problem ist, dass es in der linken oberen Seite des Bildschirms erscheint. Meine Frage ist, wie kann ich Bildschirm zentriert werden. P.S Ich habe auch versucht, JFrame zu erstellen und JPanel hinzuzufügen, aber es hat nur JFrame und JPanel separat erstellt. Hier ist der Code:So zentrieren Sie JPanel auf dem Bildschirm

import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.Timer; 
import javax.swing.JPanel; 
public class Animation extends JPanel implements ActionListener { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private Cell[][] cellMatrix; 
private Options op; 

Animation(Options received) { 

this.op = received; 
this.cellMatrix = new Cell[op.getNumberOfCells()][op.getNumberOfCells()]; 
this.setBackground(op.getBackGroundColour()); 

} 

Timer time = new Timer(5,this); 

public void paintComponent(Graphics g) { 

    super.paintComponent(g); 
    for (int i = 0; i < op.getNumberOfCells() ; i++) { 
     for(int j = 0; j < op.getNumberOfCells(); j++) {  
     Cell c1 = new Cell(); 

     if(c1.getVal() % 2 == 0) { 

      g.setColor(op.getAliveCellColour()); 
      g.fillRect(i * 10, j * 10, 10, 10); 
      c1.changeStat(0); 
      cellMatrix[i][j]= c1; 

     } 
     else { 

      g.setColor(op.getDeadCellColour()); 
      g.fillRect(i * 10,j * 10, 10, 10); 
      c1.changeStat(1); 
      cellMatrix[i][j]= c1; 

     } 
     } 
    } 
    time.start(); 

    for (int i = 0; i < op.getNumberOfCells() ; i=i+2) { 
     for (int j = 0; j < op.getNumberOfCells()-1; j++){ 
      int sum = cellMatrix[i][j].getVal() + cellMatrix[i+1][j].getVal()+ cellMatrix[i][j+1].getVal() + cellMatrix[i+1][j+1].getVal(); 
      switch(sum) { 
      case(2) : continue; 
      case(0) : cellMatrix[i][j].reverseState(); cellMatrix[i+1][j].reverseState(); cellMatrix[i][j+1].reverseState(); cellMatrix[i+1][j+1].reverseState();break; 
      case(1) : cellMatrix[i][j].reverseState(); cellMatrix[i+1][j].reverseState(); cellMatrix[i][j+1].reverseState(); cellMatrix[i+1][j+1].reverseState();break; 
      case(4) : cellMatrix[i][j].reverseState(); cellMatrix[i+1][j].reverseState(); cellMatrix[i][j+1].reverseState(); cellMatrix[i+1][j+1].reverseState();break; 
      case(3) : cellMatrix[i][j].reverseState(); cellMatrix[i+1][j].reverseState(); cellMatrix[i][j+1].reverseState(); cellMatrix[i+1][j+1].reverseState();blockShift(i,j);break; 
      } 
     } 
    } 
    for (int i = 1; i < op.getNumberOfCells()-1 ; i=i+2) { 
     for (int j = 1; j < op.getNumberOfCells()-1; j++){ 
      int sum = cellMatrix[i][j].getVal() + cellMatrix[i+1][j].getVal()+ cellMatrix[i][j+1].getVal() + cellMatrix[i+1][j+1].getVal(); 
      switch(sum) { 
      case(2) : continue; 
      case(0) : cellMatrix[i][j].reverseState(); cellMatrix[i+1][j].reverseState(); cellMatrix[i][j+1].reverseState(); cellMatrix[i+1][j+1].reverseState();break; 
      case(1) : cellMatrix[i][j].reverseState(); cellMatrix[i+1][j].reverseState(); cellMatrix[i][j+1].reverseState(); cellMatrix[i+1][j+1].reverseState();break; 
      case(4) : cellMatrix[i][j].reverseState(); cellMatrix[i+1][j].reverseState(); cellMatrix[i][j+1].reverseState(); cellMatrix[i+1][j+1].reverseState();break; 
      case(3) : cellMatrix[i][j].reverseState(); cellMatrix[i+1][j].reverseState(); cellMatrix[i][j+1].reverseState(); cellMatrix[i+1][j+1].reverseState();blockShift(i,j);break; 
      } 
     } 
    } 
} 

public void blockShift(int i, int j) { 

    Cell temp1 = new Cell(this.cellMatrix[i][j]); 
    this.cellMatrix[i][j]=this.cellMatrix[i+1][j+1]; 
    this.cellMatrix[i+1][j+1] = temp1; 
    Cell temp2 = new Cell(this.cellMatrix[i+1][j]); 
    this.cellMatrix[i+1][j] = this.cellMatrix[i][j+1]; 
    this.cellMatrix[i][j+1] = temp2; 

} 

public void actionPerformed(ActionEvent e) { 
    time.setDelay(1000); 
    repaint(); 
} 

}

Hier ist der Teil, wo ich versuche JFrame zu verwenden:

public class Animation extends JPanel implements ActionListener { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private Cell[][] cellMatrix; 
private Options op; 
private JFrame jf; 

Animation(Options received) { 

jf = new JFrame("Example"); 
jf.setSize(860, 640); 
jf.setLocationByPlatform(false); 

this.op = received; 
this.cellMatrix = new Cell[op.getNumberOfCells()][op.getNumberOfCells()]; 
this.setBackground(op.getBackGroundColour()); 
jf.add(this); 
jf.setVisible(true); 

}[![enter image description here][1]][1] 

enter image description here

Antwort

1

Wenn Sie den Rahmen erscheinen lassen bei der In der Mitte Ihres Bildschirms können Sie den Standort festlegen, indem Sie:

frame.setLocationRelativeTo(null); 

Beachten Sie, dass Sie die oben genannten nach aufrufen möchten Sie die Größe (oder pack()) Ihren Rahmen.

+0

ok danke! Was aber, wenn ich möchte, dass JPanel in der Mitte des Bildschirms erscheint oder der JFrame das JPanel enthält, scheint frame.add (this) nicht zu funktionieren. Liegt es daran, dass ich JPanel extendiere? – Keselme

+0

@Keselme Ja, Sie werden den JPanel in Ihren JFrame einfügen. Das JPanel kann nicht selbst angezeigt werden. Sie müssen es zu einem Container wie JFrame hinzufügen, um es anzuzeigen. Sie haben das Richtige getan, um JPanel anstelle von JFrame zu erweitern. Fügen Sie einfach Ihr benutzerdefiniertes JPanel einem JFrame hinzu und zeigen Sie den JFrame an. – user3437460

+0

'frame.add (this) scheint nicht zu funktionieren. Versuchen Sie dies nach Ihrem' jf.add (this) ':' jf.pack(); ',' jf.setLocationRelativeTo (null); ',' jf. setVisible (wahr); '. Entfernen Sie andere Codes wie 'setSize()' und 'setLocationByPlatform()' für den Frame, der möglicherweise Konflikte verursacht. Normalerweise würde ich die Größe für den Rahmen nicht manuell einstellen. Aber benutze pack(), um die Größe für sich selbst zu bestimmen. – user3437460

0

Sie haben eine JPanel: Sie können es zu einem JFrame hinzufügen:

Dann tun

Sie auf dem Bildschirm die JFrame zum Zentrum
Toolkit it=Toolkit.getDefaultToolkit(); 
    Dimension d=it.getScreenSize(); 
    int w=jf.getWidth(), h=jf.getHeight(); 
    jf.setLocation(d.width/2-w/2, d.height/2-h/2); 
Verwandte Themen