【问题标题】:How can I get access to the JTextPane content from a JMenuItem?如何从 JMenuItem 访问 JTextPane 内容?
【发布时间】:2017-08-14 02:31:35
【问题描述】:

我正在使用 Java (Swing) 开发文本编辑器。到目前为止,我已经制作了身体。我在使用此功能时遇到问题:

  • New (JMenuItem)(清空 JTextArea 的内容)。

当用户单击按钮时,JTextArea 内容应替换为空字符串。 这是我的代码(我省略了与问题无关的代码,例如菜单创建、菜单项添加、仅添加类。)

这是 TextArea 类:

class MyTextArea extends JTextArea implements ActionListener {
    JTextArea myTextArea;
    public MyTextArea() {
        init();

    }

    public void init(){
        setLineWrap(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }
}

(如您所见,为空。)

这是 MenuBar 类:

class MyMenuBar extends JMenuBar implements ActionListener {
    private JMenu mArchivo;
    private JMenuItem mNuevo;

    public MyMenuBar(){
        init();
        add(mArchivo);
    }

    private void init() {
        mArchivo = settingUpMenus("Archivo", "Archivo", 'A');
        mNuevo = settingUpMenuItems("Nuevo", "Nuevo", 'N');
        mArchivo.add(mNuevo);
    }

    private JMenu settingUpMenus(String mTitle, String mDescription,         
char mMnemonic) {
        JMenu mMenu;
        mMenu = new JMenu(mTitle);
        mMenu.setMnemonic(mMnemonic);

mMenu.getAccessibleContext().setAccessibleDescription(mDescription);
        mMenu.setActionCommand(mTitle);
        mMenu.addActionListener(this::actionPerformed);
        return mMenu;
    }

    private JMenuItem settingUpMenuItems(String mTitle, String 
mDescription, char mMnemonic) {
        JMenuItem mMenuItem;
        mMenuItem = new JMenuItem(mTitle);
        mMenuItem.setMnemonic(mMnemonic);



  mMenuItem.getAccessibleContext().
setAccessibleDescription(mDescription);
        mMenuItem.setActionCommand(mTitle);
        mMenuItem.addActionListener(this::actionPerformed);
        return mMenuItem;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        switch(e.getActionCommand()) {
            case "Nuevo":
                onNew();
                break;
        }
    }

    private void onNew() {

    }
}

这是类构造函数,我在其中添加 JTextArea 和 JMenu 及其项目和所有内容。

public Editor() {
    JScrollPane myScrollPane = new JScrollPane(new MyTextArea(), 
    JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
    JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    systemLook();
    setTitle("Text editor");
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setSize(new Dimension(800, 700));
    setVisible(true);
    setJMenuBar(new MyMenuBar());
    add(myScrollPane);
}

但是,我尝试了很多方法让我的新按钮访问 JTextArea 的当前实例并对其进行修改,例如在 JMenu 类的 actionPerformed 方法中获取具有 ActionEvent 对象的父类。但是我所做的任何意图都不能访问 JTextArea。有任何想法吗?我应该以其他方式实现它吗?

【问题讨论】:

  • 在构造函数中将其作为参数传递。无论如何,您不应该不必要地对组件进行子类化,您可以将它们实例化,这样您就可以直接访问。
  • 创建和实例实际上会创建该类的 new 实例。我需要的是在实际实例上工作。我会尝试将它作为参数传递给构造函数。
  • 作为参数发送给我的 JMenu 构造函数!像魅力一样工作;)
  • 直接地址,@YagoMéndezVidal 可以回复,也可以answer your own question

标签: java swing


【解决方案1】:

只需在菜单栏的构造函数中将其作为参数传递即可

...
private JTextArea myTextArea;

public MyMenuBar(MyTextArea myTextArea){
    init();
    add(mArchivo);
    this.myTextArea = myTextArea;
}
...

主要看起来像

MyTextArea myTextArea = new MyTextArea();
JScrollPane myScrollPane = new JScrollPane(myTextArea, 
        JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
        JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
systemLook();
setTitle("Text editor");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setSize(new Dimension(800, 700));
setVisible(true);
setJMenuBar(new MyMenuBar(myTextArea));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2021-04-12
    相关资源
    最近更新 更多