Frage

Im Rahmen dieses Programms brauchen wir ein 8x8 Raster von „Lifecell“ Widgets erstellen. Der Lehrer nicht erwähnt, dass die Widgets ein Objekt von Shape sein mußten, damit ich ging weiter und verwendet, um die GridLayout Klasse. Die GridLayout Klasse funktioniert gut (und ich weiß, da es keine Sehhilfe ist zu bestätigen.) Das Ziel des Programms ist es, das Spiel des Lebens zu spielen, wo ein Benutzer auf einem der Lifecell-Widgets klicken und wechselt zwischen den Staaten zu sein 'lebendig' oder ‚tot.

Meine Frage stützt sich stark auf die Zellen immer gemalt werden. Es könnte ein Problem mit meinem Code, aber ich bin nicht 100% sicher.

Program2.java

public class Program2 extends JPanel implements ActionListener {
private LifeCell[][] board; // Board of life cells.
private JButton next; // Press for next generation.
private JFrame frame; // The program frame.

public Program2() {
    // The usual boilerplate constructor that pastes the main
    // panel into a frame and displays the frame. It should
    // invoke the "init" method before packing the frame
    frame = new JFrame("LIFECELL!");
    frame.setContentPane(this);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.init();
    frame.pack();
    frame.setVisible(true);
}
    public void init() {
    // Create the user interface on the main panel. Construct
    // the LifeCell widgets, add them to the panel, and store
    // them in the two-dimensional array "board". Create the
    // "next" button that will show the next generation.
    LifeCell[][] board = new LifeCell[8][8];
    this.setPreferredSize(new Dimension(600, 600));
    this.setBackground(Color.white);
    this.setLayout(new GridLayout(8, 8));
    // here is where I initialize the LifeCell widgets
    for (int u = 0; u < 8; u++) {
        for (int r = 0; r < 8; r++) {
            board[u][r] = new LifeCell(board, u, r);
            this.add(board[u][r]);
            this.setVisible(true);

        }
    }

LifeCell.java

 public class LifeCell extends JPanel implements MouseListener {
   private LifeCell[][] board; // A reference to the board array.
   private boolean alive;      // Stores the state of the cell.
   private int row, col;       // Position of the cell on the board.
   private int count;          // Stores number of living neighbors.

   public LifeCell(LifeCell[][] b, int r, int c) {
       // Initialize the life cell as dead.  Store the reference
       // to the board array and the board position passed as
       // arguments.  Initialize the neighbor count to zero.
       // Register the cell as listener to its own mouse events.
       this.board = b;
       this.row = r;
       this.col = c;
       this.alive = false;
       this.count = 0;
       addMouseListener(this);
   }   

und hier ist die paintComponent Methode:

   public void paintComponent(Graphics gr) {
       // Paint the cell.  The cell must be painted differently
       // when alive than when dead, so the user can clearly see
       // the state of the cell.
           Graphics2D g = (Graphics2D) gr;
           super.paintComponent(gr);
           g.setPaint(Color.BLUE);
   }

Ich brauche die exakte Lösung nicht, es zu beheben, aber ich bin mit meinem Latein Ende versuchen, es an der Arbeit.

Danke.

EDIT:

ich mehr Segment Program2.java Klasse hinzugefügt, kann ich morgen wieder prüfe ich leite ins Bett, ich all Hilfe Jungs zu schätzen wissen.

EDIT # 2:

Meine wirkliche Verwirrung wird, wenn ich meinen Rahmen mit einem 8x8 GridLayout jeder einzelne „Zelle“ bevölkern aus Mangel an besseren Worte vom Typ LifeCell. Wie kann ich jede malen verschiedene Farben LifeCell? Wenn das macht keinen Sinn, überhaupt zu euch, kann ich versuchen, es zu überarbeiten, so viel wie ich kann. Und camickr, ich auf dieser Website aussehen wird, danke.

Zuordnung gefunden werden hier jegliche Verwirrung zu vermeiden in Bezug auf meine Frage und / oder den Code-Schnipsel.

War es hilfreich?

Lösung

Sie sind in der richtigen Spur.

Wenn Sie eine vorhandene Komponente (wie ein JPanel, JLabel, JButton usw.) es es viel besser nutzen möchten, dass Sie ehren, was die Komponente bereits der Fall ist, und nur parametrisieren, was gebraucht wird.

Also in Ihrem Fall, dass Sie ein JPanel verwenden, diese (und andere JComponents) eine background Eigenschaft, die Sie ändern können. Also, anstatt zu versuchen, die Komponente, um sich selbst zu malen (was im Augenblick versagt) nur diesen Wert gesetzt und lassen Sie die Farbe selbst malen.

Sie können einen „getLifeColor“ hinzufügen, die verschiedenen Farben zurückkehren je nach Zellzustand:

   private Color getLifeColor() {
       return this.alive?liveColor:deadColor;
   } 

Und dann müssen nur die Zelle, die den Hintergrund mit dieser Farbe zu malen:

  public void paintComponent(Graphics gr) {
       setBackground( getLifeColor() );
       super.paintComponent( gr );
  }

Danach müssen Sie nur den Zustand der Zelle einzustellen, zu leben oder tot, und die Komponente mit der entsprechenden Farbe angezeigt werden:

Hier die kurze Selbst korrekte Beispiel (SSCCE) des Codes enthalten Sie + die Live / Dead Farbe geschrieben Verwendungszweck. Ich glaube, Sie von dort fortsetzen können.

Andere Tipps

JPanel hat keinen Standard bevorzugte Größe oder sichtbaren Inhalt. Sie werden eine Art sichtbare Komponente hinzufügen müssen (zB JLabel) oder eine bevorzugte Größe geben.

Neben dieser, Ihr Layout sollte funktionieren, wenn Sie es eingerichtet haben, wie folgt:

JFrame frame = new JFrame();
Container cp = frame.getContentPane();
cp.setLayout(new GridLayout(8, 8));
for (int i = 0; i < 8; i++)
    for (int j = 0; j < 8; j++)
        cp.add(new JLabel(i + "-" + j));
frame.pack();
frame.setVisible(true);

Warum haben Sie sogar ein paintcomponent () -Methode für Lifecell? Es gibt keine Notwendigkeit, individuelle Malerei zu tun. Sie können die Hintergrundfarbe einer Komponente ändern, indem Sie mit:

setBackground( Color.BLUE ) 

Anders als das Ihre Frage für mich keinen Sinn macht. Zuerst erklären Sie, benötigen Sie ein Shape-Objekt zu verwenden, aber ich weiß nicht ein Shape-Objekt irgendwo in Ihrem Code sehen, so warum verwirren Sie die Frage durch, dass zu erwähnen?

Ich verstehe Ihre Frage nicht wirklich, und wir haben nicht genug von Ihrem Code keine wirklichen Vorschläge zu liefern.

Wenn Sie weitere Hilfe benötigen, senden Sie Ihre SSCCE das Problem zeigt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top