0

オンに切り替えたときにこれがロードされない理由を誰かが説明できますか. トグル グリッドのメニュー UI ボタン​​をクリックするたびに、コンソールは正しいブール値を出力しますが、グリッドは描画されません。

repaint メソッドを試し、グリッドをロードしたメソッドも再度呼び出してみました。

    private boolean toggleGrid = false;

public Editor() {

    width = DEFAULT_WIDTH;
    height = DEFAULT_HEIGHT;

    setTitle("Map Editor");
    setSize(width, height);

    mouse = new Mouse();

    addMouseListener(mouse);
    addMouseMotionListener(mouse);

    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);

    loadMenuUI();
    loadTileContainer();
    loadEditContainer();

}

private void loadMenuUI(){

    JMenuBar menuBar = new JMenuBar();
    setJMenuBar(menuBar);

    JMenu mnFile = new JMenu("File");
    menuBar.add(mnFile);

    JMenuItem mntmNewProject = new JMenuItem("New Project");
    mntmNewProject.setAccelerator(KeyStroke.getKeyStroke('N', InputEvent.CTRL_MASK));
    mnFile.add(mntmNewProject);

    JMenuItem mntmSave = new JMenuItem("Save...");
    mntmSave.setAccelerator(KeyStroke.getKeyStroke('S', Event.CTRL_MASK));
    mnFile.add(mntmSave);

    JMenuItem mntmLoad = new JMenuItem("Load...");
    mntmLoad.setAccelerator(KeyStroke.getKeyStroke('O', Event.CTRL_MASK));
    mnFile.add(mntmLoad);

    mnFile.addSeparator();

    JMenuItem mntmExit = new JMenuItem("Exit");
    mntmExit.setAccelerator(KeyStroke.getKeyStroke('N', InputEvent.CTRL_MASK));
    mnFile.add(mntmExit);

    JMenu mnOptions = new JMenu("Options");
    menuBar.add(mnOptions);

    JMenuItem mntmChangeGridSize = new JMenuItem("Change Grid Size");
    mnOptions.add(mntmChangeGridSize);

    JMenuItem mntmChangeScreenSize = new JMenuItem("Change Screen Size");
    mnOptions.add(mntmChangeScreenSize);

    JMenuItem mntmToggleGrid = new JMenuItem("Toggle Grid");
    mntmToggleGrid.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            if(toggleGrid) toggleGrid = false;
            else {
                toggleGrid = true;
                repaint();
            }
        }
    });
    mnOptions.add(mntmToggleGrid);
}

private void loadTileContainer(){
    tileContainer = new JPanel(new GridLayout(20,20));
    tileContainer.setBackground(Color.LIGHT_GRAY);
    tileContainer.setBounds(0, 0, width - 15, height - 200);
    tileContainer.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));

    if(toggleGrid){
        System.out.println("Working");
        for(int i = 0; i < 400; i++){
            JLabel label = new JLabel();
                          label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            tileContainer.add(label);
        }
    }

    contentPane.add(tileContainer);
}
4

1 に答える 1

3

このメソッドが呼び出されたら、終了です。

private void loadTileContainer(){
    tileContainer = new JPanel(new GridLayout(20,20));
    tileContainer.setBackground(Color.LIGHT_GRAY);
    tileContainer.setBounds(0, 0, width - 15, height - 200);
    tileContainer.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));

    if(toggleGrid){
        System.out.println("Working");
        for(int i = 0; i < 400; i++){
            JLabel label = new JLabel();
            label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            tileContainer.add(label);
        }
    }

    contentPane.add(tileContainer);
}

次に、メニューコード:

mntmToggleGrid.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
        if(toggleGrid) toggleGrid = false;
        else {
            toggleGrid = true;
            repaint();
        }
    }
});

ActionListener 内から単に toggleGrid を true に設定するだけでは、loadTileContainer()メソッドが魔法のように再度呼び出されることはないため、ActionListener が効果を発揮しないことは驚くことではありません。代わりに、if ブロックからコードを抽出し、必要に応じてアクション リスナーから呼び出すことができる独自のメソッドに配置する必要があります。

revalidate()次に、コンテナーの内容を変更した後、コンテナーに対して を呼び出し、次にを呼び出す必要がありますrepaint()

ただし、CardLayout を使用してコンポーネントを交換する方がはるかに優れています。CardLayout チュートリアルでその方法を説明します。

于 2013-09-17T21:59:24.323 に答える