0

有人可以解释为什么我打开时没有加载。每当我单击切换网格的菜单 UI 按钮时,控制台都会打印出正确的布尔值,但网格不会绘制。

我尝试了重绘方法,并尝试再次调用加载网格的方法。

    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 回答