如何从动作侦听器

时间:2016-03-21 23:47:46

标签: java swing actionlistener jtabbedpane

我遇到了问题并找到了解决方案,但我无法理解为什么以下代码无效。 我想要做的是,当在“Administration.class”中按下按钮时,标签正在切换。 我有一个JTabbedPane,它被添加到“Main.class”中。它被声明为私有变量。

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();
        }
    });

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

这有效: Main.class

public static JTabbedPane JTP;

Administration.class

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

为什么示例首先不起作用,也许你们有一个链接,在那里我可以看一下描述这个问题的内容。如果你只是想处理变量及其方法,那么更好的方法是什么? 提前谢谢!

Main.class:

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();
        }
    });
}

}

3 个答案:

答案 0 :(得分:0)

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);
    }
}

答案 1 :(得分:0)

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

所以而不是

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

你需要

myMainFrame.SetPane();

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

答案 2 :(得分:0)

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