【问题标题】:How can I call a method on a parent panel from an action listener如何从动作侦听器调用父面板上的方法
【发布时间】:2016-03-21 23:47:45
【问题描述】:

我遇到了问题并找到了解决方案,但我不明白为什么下面的代码不起作用。 我想要做的是,当在“Administration.class”中按下按钮时,选项卡正在切换。 我在“Main.class”中添加了一个 JTabbedPane。它被声明为私有变量。

private JTabbedPane JPT;

然后我有一个简单的方法,它会在调用时更改选项卡:

public void SetPane() {
    JTP.setSelectedIndex(2);
}

然后我在 Administration.class 中创建 Main.class 的一个对象,并在按下按钮时调用此方法:

btnRework.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Main m = new Main();
            m.SetPane();
        }
    });

但这不起作用。什么都没有发生,当按钮被点击时,我什至没有出错。

这有效: 主类

public static JTabbedPane JTP;

管理类

btnRework.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Main.JTP.setSelectedIndex(2);
        }
    });

为什么 example first 不起作用,也许你们有一个链接,我可以在其中查看描述此问题的内容。如果您只想处理变量及其方法,那么更好的方法是什么? 提前致谢!

主类:

public class Main extends JDialog {

private static final long serialVersionUID = 1L;

private Home home = new Home();
private Insertation insertation = new Insertation();
private Edit edit = new Edit();
private Administration administration = new Administration();
private Addition addition = new Addition();
public static JTabbedPane JTP;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    try {
        Main dialog = new Main();
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.setVisible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * Create the dialog.
 */
public Main() {
    super(null, java.awt.Dialog.ModalityType.TOOLKIT_MODAL);
    setResizable(false);
    setSize(1030, 720);
    getContentPane().setLayout(new BorderLayout());
    setTitle("Ebay Manager");

    JTP = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
    JTP.addTab("Home", home);
    JTP.addTab("Inserat", insertation);
    JTP.addTab("Bearbeitung", edit);
    JTP.addTab("Verwaltung", administration);
    JTP.addTab("Zusatz", addition);
    getContentPane().add(JTP);
}

}

Administration.class:

public class Administration extends JPanel {

private static final long serialVersionUID = 1L;
private JButton btnRework;
private Main main;

/**
 * Create the panel.
 */
public Administration() {
    setLayout(null);
    setSize(1000, 650);
    setDoubleBuffered(true);

    btnRework = new JButton("Bearbeiten");
    btnRework.setBounds(42, 571, 116, 32);
    add(btnRework);
    btnRework.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            main.SetPane();
        }
    });
}

}

【问题讨论】:

  • 您基本上想了解静态字段和非静态字段之间的区别(类的所有对象的静态内容都相同,每个对象的非静态字段可能不同)。一般来说,您应该避免使用静态字段。
  • 常量除外。

标签: java swing actionlistener jtabbedpane


【解决方案1】:

您正在一个新的未绘制框架中切换窗格,该框架是您在动作侦听器中创建并丢弃的。您需要在应用程序中(可能)打包和绘制的框架中切换窗格。

所以不是

Main m = new Main();
m.SetPane();

你需要

myMainFrame.SetPane();

您如何创建和记住 myMainFrame 超出了此答案的范围(除非您在问题中添加更多代码)。

【讨论】:

  • 动作监听器是在主框架中的按钮上还是在 JTP 选项卡式窗格中?假设MainJFrame,那么您可能想要((Main) ((JTabbedPane) e.getSource()).getParent()).setPane()
【解决方案2】:
Main m = new Main();
m.SetPane();

在这里,您正在创建Main 的实例,但您没有在任何地方添加它。

编辑:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

public class Administrator extends JFrame {
    private Main main;
    public Administrator() {
        main = new Main();

        add(main);

        JButton button = new JButton("Set");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                main.setPane();
            }
        });

        add(button, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
        Administrator adminFrame = new Administrator();
        adminFrame.setSize(400, 400);
        adminFrame.setVisible(true);

    }
}

class Main extends JPanel {
    private JTabbedPane jtp;

    public Main() {
        super(new BorderLayout());
        jtp = new JTabbedPane();

        jtp.add("tab1", new JLabel("Content1"));
        jtp.add("tab2", new JLabel("Content2"));

        add(jtp);
    }

    public void setPane() {
        jtp.setSelectedIndex(1);
    }
}

【讨论】:

  • 我这样做只是为了能够调用方法 SetPane()。编程风格不好?
  • 问题不在于你调用setPane(),而在于你调用的是哪个对象setPane()on
  • 我添加了一个示例代码。不是一个好的布局,但它可以按你的意愿工作,检查一下。
  • 你的意思是,他没有使用 Main.class 中的变量 JTP?
  • “他没有在 Main.class 中使用变量 JTP”是什么意思?
【解决方案3】:

由于 rdonuk 的回答,我找到了自己的解决方案。因为我不能创建 Main.class 的另一个实例,所以我在创建 Main.class 时将 JTabbedPane 设置为 Administration.class 中的变量。只是一个简单的设置方法。谢谢大家的回答!

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 2020-06-13
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    相关资源
    最近更新 更多