0

数独の GUI に取り組んでいます。Droid (SudokuFree) 用の優れたアプリがあり、その機能をコピーして小さな機能を 1 つ追加したいと考えています (進行中のボードを保存し、続行し、必要に応じて元に戻す)。一部のコードは、より SSCCE にするためにコメント アウトされています。質問がある場合は、2 番目の投稿を参照してください。2 つの投稿が非常に役に立ち、以下のコードの多くを借りてきました。

JButton 配列のアクションリスナー

数独ソルバー用の GUI の構築 (ASCII の例で完成)

私の問題は、JButton がスクロールされた後にのみ表示されることです。以前の投稿を検索したところ、既に行った setVisible(true) への参照のみが見つかりました。

ありがとうございました

public class RunSudokuNinja implements Runnable{
    @Override
    public void run() {
        //SudokuEngineInterface sudokuEngine = new SudokuEngine();
        SudokuView sudokuView = new SudokuView();
        //sudokuView.setSudokuImplementation(sudokuEngine);
        sudokuView.setVisible(true);
    }
    public static void main(String[] args) {
        EventQueue.invokeLater(new RunSudokuNinja());
    }
}

public class SudokuView extends JFrame{
    //SudokuController controller;
    //SudokuEngine sudokuEngine;

    private static final int width = 500;
    private static final int height = 650;
    private static final int yMar = 100;
    private static final int xMar = 25;
    private static final int cellSize = 40;
    private static final int gridSpace = 3;
    private static final int secSpace = 9;

    public JButton[][] btnz = new JButton[9][9];

    public SudokuView() {
        //controller = new SudokuController();
        //sudokuEngine = new SudokuEngine();

        setTitle("Sudoku Ninja 0.1");
        setSize(width, height);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);
        setBackground(Color.GRAY);

        int y=yMar;
        for (int r=0;r<9;r++){
            int x=xMar;
            for (int c=0;c<9;c++){
                btnz[r][c]=new JButton("1");
                btnz[r][c].setBounds(x,y,cellSize,cellSize);
                btnz[r][c].setVisible(true);
                add(btnz[r][c]);
                if (c==2||c==5){
                    x = x+cellSize+secSpace;
                }else{
                    x = x+cellSize+gridSpace;
                }
            }
            if (r==2||r==5){
                y = y+cellSize+secSpace;
            }else{
                y = y+cellSize+gridSpace;
            }
        }
        setVisible(true);
    }

    @Override
    public void paint(Graphics g){

    }


    public void setSudokuImplementation(SudokuEngineInterface listener) {
        //controller.setListener(listener);
    }
}
4

2 に答える 2

3

JFrameのメソッドをオーバーライドしpaint、ペイント メカニズムをショートさせています。このメソッドには機能がないため、次の行を削除できます。

@Override
public void paint(Graphics g){

}

意図したカスタム ペインティングは、 のようなトップ レベルのコンテナではなくpaintComponent、 のサブクラスでオーバーライドすることによって行うのが理想的です。これは、Swing のダブル バッファリング ペイント メカニズムを利用します。JComponentJFrame

于 2013-03-24T13:58:07.557 に答える
3

paint何もしないようにメソッドをオーバーライドしています。paint()これを修正してください:

public void paint(Graphics g){
    super.paint(g);
    //do whatever you need to do here
}
于 2013-03-24T13:58:29.130 に答える