通过 revalidate() 和 repaint() 更新 Swing 中的 JMenu 不起作用

现在怎么办

在登录过程中,如果管理员正在登录,我想启用名为Admin 的JMenuItem 程序启动时,其可见性设置为 false。因此,当用户单击“登录”时,我再次运行 JMenu 并尝试仅将Admin现在设置为 true来重新创建它这是我的 initialize 方法的代码,如果它检测到用户是管理员,它就会运行。该方法位于应用程序使用的 JMenuBar 类中。

public void initialize() {

    file = new JMenu("File");
    file.setName("File Menu");
    file.addMouseListener(this);

    help = new JMenu("Help");
    help.setName("Help Menu");
    help.addMouseListener(this);

    login = new JMenu("Login");
    login.setName("Login Menu");
    login.addMouseListener(this);

    language = new JMenu("Language");
    language.setName("Language Menu");
    language.addMouseListener(this);

    admin = new JMenu("Admin");
    admin.setName("Admin Menu");
    if(LoginDialog.AdminLoggedIn) {
        admin.setEnabled(true);
    } else
        admin.setEnabled(false);
    admin.addMouseListener(this);   

    add(file);
    add(login);
    add(help);
    add(language);
    add(admin);

    this.revalidate();
    this.repaint();

}

谢谢。

充满鳗鱼的气垫船

我建议不要重新创建您的 JMenu,而是修改它,具体取决于您程序的管理员状态。您可以为程序提供一个权限枚举,一个带有 REGULAR 和 ADMINISTRATOR(可能还有其他)字段的枚举,例如:

public enum Privileges {
    REGULAR("Regular"), ADMINISTRATOR("Administrator");
    private String text;
    private Privileges(String text) {
        this.text = text;
    }

    @Override
    public String toString() {
        return text;
    }
}

然后根据程序的权限状态更改 JMenu 的状态。另请注意:不要在菜单上使用 MouseListener ,因为它们不尊重菜单/菜单项/按钮的启用/禁用状态。例如,这是我的小型MVCE示例,它使用模型-视图-控制器结构(各种):

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.*;
import javax.swing.event.SwingPropertyChangeSupport;

@SuppressWarnings("serial")
public class MenuChanger extends JPanel {
    private CreateMenu createMenu = new CreateMenu();
    private MenuChngModel model = new MenuChngModel();
    private ButtonGroup buttonGroup = new ButtonGroup();

    public MenuChanger() {
        setPreferredSize(new Dimension(400, 300));
        model.addPropertyChangeListener(MenuChngModel.PRIVILEGES, new ModelListener());

        JPanel privilegesPanel = new JPanel();
        privilegesPanel.setLayout(new GridLayout(0, 1, 5, 5));
        privilegesPanel.setBorder(BorderFactory.createTitledBorder("Privileges"));

        for (final Privileges privileges : Privileges.values()) {
            JRadioButton rBtn = new JRadioButton(privileges.toString());
            if (privileges == Privileges.REGULAR) {
                rBtn.setSelected(true);
            }
            rBtn.addActionListener(e -> {
                createMenu.setPrivileges(privileges);
            });
            buttonGroup.add(rBtn);
            privilegesPanel.add(rBtn);
        }

        add(privilegesPanel);

    }

    public CreateMenu getCreateMenu() {
        return createMenu;
    }

    private class ModelListener implements PropertyChangeListener {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            Privileges privileges = (Privileges) evt.getNewValue();
            createMenu.setPrivileges(privileges);
        }
    }

    private static void createAndShowGui() {
        MenuChanger mainPanel = new MenuChanger();

        JFrame frame = new JFrame("MenuChanger");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.setJMenuBar(mainPanel.getCreateMenu().getMenubar());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

class MenuChngModel {
    public static final String PRIVILEGES = "privileges";
    private SwingPropertyChangeSupport pcSupport = new SwingPropertyChangeSupport(this);
    private Privileges privileges = Privileges.REGULAR;

    public Privileges getPrivileges() {
        return privileges;
    }

    public void setPrivileges(Privileges privileges) {
        Privileges oldValue = this.privileges;
        Privileges newValue = privileges;
        this.privileges = privileges;
        pcSupport.firePropertyChange(PRIVILEGES, oldValue, newValue);
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        pcSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        pcSupport.removePropertyChangeListener(listener);
    }

    public void addPropertyChangeListener(String name, PropertyChangeListener listener) {
        pcSupport.addPropertyChangeListener(name, listener);
    }

    public void removePropertyChangeListener(String name, PropertyChangeListener listener) {
        pcSupport.removePropertyChangeListener(name, listener);
    }

}

enum Privileges {
    REGULAR("Regular"), ADMINISTRATOR("Administrator");
    private String text;
    private Privileges(String text) {
        this.text = text;
    }

    @Override
    public String toString() {
        return text;
    }
}

class CreateMenu {
    private JMenuBar menubar = new JMenuBar();
    private JMenu fileMenu = new JMenu("File");
    private JMenu adminMenu = new JMenu("Administrator");
    private JMenuItem fileMenuItem = new JMenuItem("File Menu Item");
    private JMenuItem adminFileMenuItem = new JMenuItem("Admin File Menu Item");


    public CreateMenu() {
        fileMenu.setMnemonic(KeyEvent.VK_F);
        adminMenu.setMnemonic(KeyEvent.VK_A);

        fileMenu.add(fileMenuItem);
        fileMenu.add(adminFileMenuItem);       
        adminMenu.add(new JMenuItem("Foo 1"));
        adminMenu.add(new JMenuItem("Foo 2"));
        adminFileMenuItem.setEnabled(false);
        adminMenu.setEnabled(false);
        menubar.add(fileMenu);
        menubar.add(adminMenu);
    }

    public void setPrivileges(Privileges privileges) {
        switch (privileges) {
        case REGULAR:
            adminMenu.setEnabled(false);
            adminFileMenuItem.setEnabled(false);
            break;
        case ADMINISTRATOR:
            adminMenu.setEnabled(true);
            adminFileMenuItem.setEnabled(true);
            break;

        default:
            break;
        }
    }

    public JMenuBar getMenubar() {
        return menubar;
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swing repaint()在循环或线程中不起作用

来自分类Dev

如何使用repaint()和revalidate()?

来自分类Dev

在 Swing、Java 中向 JPanel 添加更多组件后,Repaint() 不起作用

来自分类Dev

如何正确使用repaint()和revalidate()?

来自分类Dev

Java repaint()在调用中不起作用

来自分类Dev

Java repaint()在调用中不起作用

来自分类Dev

Repaint()不起作用

来自分类Dev

在JMenuBar可见后更新JMenu和JMenu字体

来自分类Dev

在JMenuBar可见后更新JMenu和JMenu字体

来自分类Dev

multi_query在mysqli中不起作用,无法通过sphinxql更新实时sphinx索引

来自分类Dev

Swing中的Paint- Repaint机制

来自分类Dev

Symfony和Composer更新不起作用

来自分类Dev

为什么revalidate()和repaint()不能像我期望的那样工作?

来自分类Dev

使用Polymer通过HTML Imports包含jQuery在Safari和Firefox中不起作用

来自分类Dev

通过下拉列表和提交进行选择在Classic ASP中不起作用

来自分类Dev

在C#和Access中更新当前记录不起作用

来自分类Dev

删除和更新查询在ADO.NET中不起作用

来自分类Dev

更新模糊在angularjs中不起作用

来自分类Dev

更新查询在Android中不起作用

来自分类Dev

gridview中的行更新不起作用

来自分类Dev

SVN更新在Tortoise中不起作用

来自分类Dev

更新查询在sqlite中不起作用

来自分类Dev

更新查询在Android中不起作用

来自分类Dev

更新查询在Phonegap中不起作用

来自分类Dev

更新模糊在angularjs中不起作用

来自分类Dev

Windows更新在VirtualBox中不起作用

来自分类Dev

JScroll在右面板JSplitPane中不起作用-Swing Java

来自分类Dev

ArrayList <String>中的JComboBox-不起作用-Java Swing

来自分类Dev

UI验证在Swing MetaWidget中不起作用

Related 相关文章

热门标签

归档