jbutton在开始时不可见

时间:2013-03-24 13:50:27

标签: java swing user-interface jbutton paint

我正在为数独的GUI工作。我有一个很好的应用程序为我的Droid(SudokuFree),我想复制其功能,并添加一个小功能(保存正在进行的板,继续,并在需要时还原)。一些代码已被注释掉以使其更加SSCCE,如果您有疑问,请参阅第二篇文章。两篇帖子给了我很多帮助,我从他们那里借了很多代码。

Action listener for JButton array

Building a GUI for a Sudoku Solver (Complete with ASCII Example)

我的问题是JButtons只有在被骂之后才能看到。我搜索过以前的帖子,只找到了对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);
    }
}

2 个答案:

答案 0 :(得分:3)

您将覆盖JFrame的{​​{1}}方法并缩短绘制机制。鉴于此方法中没有任何功能,您可以删除以下行:

paint

理想情况下,任何预期的自定义绘图都应该通过在@Override public void paint(Graphics g){ } 的子类中覆盖paintComponent而不是在JComponent等顶级容器中来完成。这利用了Swing的双缓冲涂料机制。

答案 1 :(得分:3)

您要覆盖paint方法,告诉它什么都不做,请更正paint()到这个:

public void paint(Graphics g){
    super.paint(g);
    //do whatever you need to do here
}