Java在可运行的Jar文件中的内容之间来回移动

时间:2014-03-12 10:30:15

标签: java user-interface jar

我对编程很陌生,所以我不知道正确的做事方式,只是尝试了一下。我想创建一个runnable,我可以在不同的内容之间来回移动。以下是从eclipse内部运行时的工作原理,但如果我将其导出为JAR文件,一旦我向前移动一次然后再向后移动,向前移动不会再给我内容了,但只是背面按钮。 我试过这样的事情:

public class TestMain extends JFrame {
static PanelClass panel;
static boolean inUse = false;

public static void main(String[] args) {
    panel = new PanelClass();

    final TestMain test = new TestMain();
    final Container container = test.getContentPane();
    container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));
    test.setSize(500, 500);

    final JButton back = new JButton("Back");
    back.setAlignmentX(Component.CENTER_ALIGNMENT);
    back.setMaximumSize(new Dimension(200, 80));
    back.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            test.getContentPane().removeAll();
            test.setContentPane(container);
            test.getContentPane().revalidate();

        }
    });

    final JButton exit = new JButton("Exit");
    exit.setAlignmentX(Component.CENTER_ALIGNMENT);
    exit.setMaximumSize(new Dimension(200, 80));
    exit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.exit(0);

        }
    });

    JButton problem = new JButton("Problem");
    problem.setMaximumSize(new Dimension(200, 80));
    problem.setAlignmentX(Component.CENTER_ALIGNMENT);
    problem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            inUse = true;
            test.setContentPane(panel);
            test.getContentPane().add(back);
            test.getContentPane().revalidate();

        }
    });

    container.add(problem);
    container.add(exit);

    test.setVisible(true);
    test.setDefaultCloseOperation(EXIT_ON_CLOSE);
    test.setLocationRelativeTo(null);

    while (true) {
        while (!panel.stop && !inUse) {
        }
        inUse = false;
        panel = new PanelClass();
        test.setContentPane(panel);
        test.getContentPane().add(back);
        test.getContentPane().revalidate();
    }

}

}

我想要的课程作为第二个内容:

public class PanelClass extends JPanel {
JTextArea text = new JTextArea("Some text here!" + '\n' + '\n');
JButton button1 = new JButton("Button 1");
JButton button2 = new JButton("Button 2");

boolean stop = false;

public PanelClass() {
    text.setEditable(false);
    text.setMaximumSize(new Dimension(300, 300));
    this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
    Dimension d = new Dimension(200, 60);

    button1.setAlignmentX(Component.CENTER_ALIGNMENT);
    button1.setMaximumSize(d);
    button2.setAlignmentX(Component.CENTER_ALIGNMENT);
    button2.setMaximumSize(d);
    this.add(text);
    this.add(button1);
    this.add(button2);

}

}

实际工作方式是什么?如果我有很多窗户,我希望能够在两者之间来回移动怎么办?我知道它有很多糟糕/可能难以阅读的代码,但我希望有人可以帮助我。

2 个答案:

答案 0 :(得分:1)

这是按下"问题"

时运行的代码
        test.setContentPane(panel);
        test.getContentPane().add(back);
        test.getContentPane().revalidate();

这是按下"后退"

时运行的代码
        test.getContentPane().removeAll();
        test.setContentPane(container);
        test.getContentPane().revalidate();

当您按下"问题"时,呼叫的顺序是什么?然后"返回"那么"问题"?就是这样。 (revalidate()调用不会弄乱任何东西,所以我不会显示它们)

        // Problem
        test.setContentPane(panel);
        test.getContentPane().add(back);
        // Back
        test.getContentPane().removeAll();
        test.setContentPane(container);
        // Problem
        test.setContentPane(panel);
        test.getContentPane().add(back);

请注意,您将面板设置为内容窗格,然后在" Back"时删除其中的所有组件。被压了。下次按"问题"时,面板上没有任何组件,因为您已将其删除。

答案 1 :(得分:0)

当你从eclipse导出为JAR时,你是否尝试导出为可运行的jar并选择包所需的库到生成的jar中?