3 Stimmen

Java-Layout-Problem

Ich habe 3 Klassen in meinem Programm.

public class Field extends JLabel{

    private int x, y;

    public Field(int x, int y){
        this.x = x;
        this.y = y;
        setOpaque(true);
        setMinimumSize(new Dimension(50,50));
        setPreferredSize(new Dimension(75,75));
        if((x + y) % 2 == 0)
            setBackground(Color.GREEN);
        else
            setBackground(Color.YELLOW);
    }

public class Board extends JPanel{

    public Field[][] fields = new Field[8][8];

    public Board(){
        setLayout(new GridLayout(8,8));
        setMinimumSize(new Dimension(500,500));
        setPreferredSize(new Dimension(550,550));
        setBackground(Color.RED);
        fillBoard();
    }

    private void fillBoard(){
        for(int i = 0; i < 8; ++i){
            for(int j = 0; j < 8; ++j){
                fields[i][j] = new Field(i, j);
                add(fields[i][j]);
            }
        }
    }

public class GUI extends JFrame{

    public Board board;

    private GUI(){
        board = new Board();
        setLayout(new FlowLayout());
        add(board);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        pack();
    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new GUI();
            }
        });
    }

}

Immer wenn ich das Programm ausführe, diese erscheint anstelle einer gelb-grünen Tafel. Kann jemand bitte helfen?

3voto

trashgod Punkte 199887

Ihr geposteter Code lässt sich nicht kompilieren. Re-factoring in verschachtelte Klassen machte es funktionieren richtig wie gezeigt, daher vermute ich, dass Sie ein Problem auf Projektebene haben.

enter image description here

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GUI extends JFrame {

    private Board board;

    private GUI() {
        board = new Board();
        setLayout(new FlowLayout());
        add(board);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new GUI();
            }
        });
    }

    class Board extends JPanel {

        public Field[][] fields = new Field[8][8];

        public Board() {
            setLayout(new GridLayout(8, 8));
            setMinimumSize(new Dimension(500, 500));
            setPreferredSize(new Dimension(550, 550));
            setBackground(Color.RED);
            fillBoard();
        }

        private void fillBoard() {
            for (int i = 0; i < 8; ++i) {
                for (int j = 0; j < 8; ++j) {
                    fields[i][j] = new Field(i, j);
                    add(fields[i][j]);
                }
            }
        }
    }

    class Field extends JLabel {

        private int x, y;

        public Field(int x, int y) {
            this.x = x;
            this.y = y;
            setOpaque(true);
            setMinimumSize(new Dimension(50, 50));
            setPreferredSize(new Dimension(75, 75));
            if ((x + y) % 2 == 0) {
                setBackground(Color.GREEN);
            } else {
                setBackground(Color.YELLOW);
            }
        }
    }
}

-1voto

james_bond Punkte 6678

Sie sollten Layout-Manager und fügen Sie Komponente auf die contentPane auf JFrame, innerhalb GUI sollten Sie aufrufen:

getContentPane().setLayout(new FlowLayout());
getContentPane().add(board);

Ihr Code lässt sich kompilieren, wenn sowohl Board als auch Field zu inneren Klassen umstrukturiert werden, aber das Ergebnis sieht wie folgt aus Result

Damit die Schnittstelle ohne die rote Linie aussieht, kommentieren Sie setPreferredSize(new Dimension(550,550)); auf Ihren Board-Konstruktor, damit er zu:

public Board(){
        int rows = 8,cols = 8;
    setLayout(new GridLayout(rows,cols));
    setMinimumSize(new Dimension(500,500));
    //setPreferredSize(new Dimension(550,550));
    setBackground(Color.RED);
    fillBoard();
}

The result after removing setPreferredSize()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X