1

私はSwingforGUIを使って小さなゲームを書いていますが、問題が発生しました。状況をよりよく把握できるように、スクリーンショットを投稿しています。

ここに画像の説明を入力してください

最初は、使用したボードしかありませんでしたGridLayout

ただし、スコアを表示するためのパネルを追加する必要があったため、を削除しGridLayoutましたGridBagLayoutJPanelスコアの新しいものを適切に配置JTextAreaし、結果を表示するために2を追加しました。

重要なのは、プレーヤーの1人が移動するたびに(したがって、ボードが新しい状態を反映するように再描画される)、テキスト領域がちらつき、ボードで部分的に覆われることです(スクリーンショットを参照)。問題が何であるかについて何か考えはありますか?すべてのコンポーネントの推奨サイズを設定して使用してみsetOpaqueましたが、役に立ちませんでした。

メインレイアウトホルダーのコード。

public class BoardLayout extends JFrame implements ModelObserver {

    /**
     * {@value}
     */
    private static final long serialVersionUID = 5834762299789973250L;

    /**
     * {@value}
     */
    private static final int RESULTS_PANEL_HEIGHT = 100;

    private final BoardEventsListener eventsListener;

    private final ResultsLayout resultsLayout;

    private class CellMouseListener implements MouseListener {

        private final int cellIndex;

        public CellMouseListener(final int index) {
            cellIndex = index;
        }

        @Override
        public void mouseClicked(final MouseEvent event) {
            eventsListener.onCellSelected(cellIndex);
        }

        @Override
        public void mouseEntered(final MouseEvent event) {
            // blank
        }

        @Override
        public void mouseExited(final MouseEvent event) {
            // blank
        }

        @Override
        public void mousePressed(final MouseEvent event) {
            // blank
        }

        @Override
        public void mouseReleased(final MouseEvent event) {
            // blank
        }

    }

    public BoardLayout(final BoardEventsListener listener) throws HeadlessException {
        this(listener, "", null);
    }

    public BoardLayout(GraphicsConfiguration graphicsConfiguration) {
        this(null, "", graphicsConfiguration);
    }

    public BoardLayout(final BoardEventsListener listener, String title,
            GraphicsConfiguration graphicsConfiguration) {
        super(title, graphicsConfiguration);

        eventsListener = listener;

        setLayout(new GridBagLayout());
        setBoardSize();
        populateCells();
        resultsLayout = attachResultsLayout();

        resultsLayout.setOpaque(true);

        setVisible(true);
    }

    private ResultsLayout attachResultsLayout() {
        final ResultsLayout resultsLayout = new ResultsLayout(Game.BOARD_COLUMN_COUNT
                * BoardCellLayout.WIDTH_BOARD_CELL, RESULTS_PANEL_HEIGHT);
        final GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridwidth = GridBagConstraints.REMAINDER;
        constraints.gridheight = GridBagConstraints.REMAINDER;
        constraints.gridx = 0;
        constraints.gridy = 8;
        getContentPane().add(resultsLayout, constraints, 64);
        return resultsLayout;
    }

    private void setBoardSize() {
        final Dimension boardDimension = getBoardDimension();
        setMinimumSize(boardDimension);
        setSize(boardDimension);
        setResizable(false);
    }

    private void populateCells() {
        final Container container = getContentPane();
        for (int i = 0; i < Game.BOARD_ROW_COUNT; ++i) {
            for (int j = 0; j < Game.BOARD_COLUMN_COUNT; ++j) {
                final BoardCellLayout currentCell = new BoardCellLayout();
                final int cellIndex = i * Game.BOARD_COLUMN_COUNT + j;
                final GridBagConstraints constraints = new GridBagConstraints();
                constraints.gridx = j;
                constraints.gridy = i;
                container.add(currentCell, constraints, cellIndex);
                currentCell.setOpaque(true);
                currentCell.addMouseListener(new CellMouseListener(cellIndex));
            }
        }
    }

    private Dimension getBoardDimension() {
        final Dimension boardDimension = new Dimension(Game.BOARD_COLUMN_COUNT
                * BoardCellLayout.WIDTH_BOARD_CELL, (Game.BOARD_ROW_COUNT + 1)
                * BoardCellLayout.HEIGHT_BOARD_CELL);
        return boardDimension;
    }

    public BoardLayout(String title) throws HeadlessException {
        this(null, title, null);
    }

    @Override
    public void setVisible(final boolean isVisible) {
        super.setVisible(isVisible);
        setBackground(Color.WHITE);
        pack();
    }

    @Override
    public void onModelChanged(Collection<Cell> changedCells, final int whiteDiscsCount,
            final int blackDiscsCount) {
        for (final Cell cell : changedCells) {
            final BoardCellLayout boardCell = getCellAt(cell.getIndex());
            boardCell.take(cell.getOwner());
        }
        resultsLayout.onResultChanged(whiteDiscsCount, blackDiscsCount);

    }

    @Override
    public void onNextMovesAcquired(Collection<Cell> nextMoves) {
        clearCellHighlight();
        for (final Cell cell : nextMoves) {
            final BoardCellLayout boardCell = getCellAt(cell.getIndex());
            boardCell.highlight();
        }
    }

    private void clearCellHighlight() {
        final Container container = getContentPane();
        for (int i = 0; i < container.getComponentCount() - 1; ++i) {
            final BoardCellLayout boardCellLayout = (BoardCellLayout) container.getComponent(i);
            boardCellLayout.clearHighlight();
        }
    }

    private BoardCellLayout getCellAt(final int index) {
        final Container container = getContentPane();
        return (BoardCellLayout) container.getComponent(index);
    }
}

結果を保持するパネルのコード:

public class ResultsLayout extends JPanel {

    /**
     * {@value}
     */
    private static final long serialVersionUID = 8379710427718395507L;

    private final ResultsTextView whiteTextView;

    private final ResultsTextView blackTextView;

    public ResultsLayout(final int width, final int height) {
        super(new GridLayout(2, 1));

        setVisible(true);

        final Dimension dimension = new Dimension(width, height);
        setMinimumSize(dimension);
        setPreferredSize(dimension);
        setSize(dimension);

        whiteTextView = new ResultsTextView(Player.WHITE);
        blackTextView = new ResultsTextView(Player.BLACK);

        add(whiteTextView, 0);
        add(blackTextView, 1);
    }

    public void onResultChanged(final int whiteDiscsCount, final int blackDiscsCount) {
        whiteTextView.setDiscCount(whiteDiscsCount);
        blackTextView.setDiscCount(blackDiscsCount);
    }

}

結果を保持するJTextAreaのコード:

public class ResultsTextView extends JTextArea {

    /**
     * {@value}
     */
    private static final long serialVersionUID = -6354085779793155063L;

    /**
     * {@value}
     */
    public static final String BACKGROUND_COLOR = "#066f02";

    private static final int START_DISCS_NUMBER = 2;

    private final Player player;

    public ResultsTextView(final Player player) {
        super();
        setEditable(false);

        setBackground(Color.decode(BACKGROUND_COLOR));

        this.player = player;
        setText(player.toString() + " result is: " + START_DISCS_NUMBER);

        final Dimension dimension = new Dimension(100, 20);
        setPreferredSize(dimension);
        setMinimumSize(dimension);
        setMaximumSize(dimension);
    }

    public void setDiscCount(final int discCount) {
        setText(player.toString() + " result is:" + discCount);
    }

}
4

2 に答える 2

2

スコアパネルを追加すると、ゲームボードとスコアの両方が同じゲームモデルをリッスンするビューであるMVCパターンを思い浮かべます。引用されたには、デザインとレイアウトに関する洞察を提供する可能性のあるグリッドベースのゲームもあります。特に、ビュー、in 、およびビュー、inは、それぞれをリッスンします。ゲームパネルはを占めます。RCStatusBorderLayout.NORTHRCInfoBorderLayout.SOUTHRCModelBorderLayout.CENTER

あなたが提供したフラグメントに関するいくつかのメモ:

  • メインビューを拡張してインスタンスJPanelに追加します。JFrame

  • 単一のレイアウトですべての問題を解決しようとしないでください。

  • を検討extends MouseAdapterしてくださいimplements MouseListener

  • 再考してsetXxxSize()ください。

于 2013-01-17T03:57:34.313 に答える
1

問題は、GUIの更新に使用しておらずSwingUtilities.invokeLater、ちらつきが発生していたことです。私はそれを使い始めました、そしてそれは今すべて大丈夫です:)

于 2013-01-17T19:47:33.513 に答える