点击按钮打开一个新窗口的Java实现方法

8

我已经坐在电脑前工作了大约13个小时,我觉得我的眼睛都快流血了。 我发现一个我喜欢的小GUI编辑器叫GuiGenie。 它非常适合创建具有按钮和其他好东西的窗口。 问题是,我想点击第一个菜单中的按钮,然后打开我创建的另一个菜单。 我刚刚开始学习编程,只有4周,所以我完全不懂。 我有一种感觉,它出错了,可能是因为主要方法的问题,但我毫无头绪,坐在这里尝试了数百万次仍然没有结果,让我有点疯狂 : ) 这就是我目前的情况

 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import javax.swing.event.*;

public class MyPanel extends JPanel {
private JTextField How;
private JLabel jcomp2;
private JLabel jcomp3;
private JButton jcomp4;

public MyPanel() {
    //construct components
    How = new JTextField (1);
    jcomp2 = new JLabel ("How long were you parked?");
    jcomp3 = new JLabel ("Minutes");
    jcomp4 = new JButton ("openNewWindow");

    //adjust size and set layout
    setPreferredSize (new Dimension (315, 85));
    setLayout (null);

    //add components
    add (How);
    add (jcomp2);
    add (jcomp3);
    add (jcomp4);

    //set component bounds (only needed by Absolute Positioning)
    How.setBounds (245, 50, 60, 25);
    jcomp2.setBounds (35, 30, 185, 50);
    jcomp3.setBounds (250, 30, 60, 20);
    jcomp4.setBounds (0, 0, 315, 25);

       jcomp4.addActionListener( new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {

        }
    });
}


public static void main (String[] args) {
    JFrame frame = new JFrame ("MyPanel");
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add (new MyPanel());
    frame.pack();
    frame.setVisible (true);
}
}

当按下按钮时,我希望它能打开这个新窗口。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class MyPanel2 extends JPanel {
private JButton jcomp1;
private JButton jcomp2;
private JButton jcomp3;
private JTextField jcomp4;

public MyPanel2() {
    //construct components
    jcomp1 = new JButton ("test1");
    jcomp2 = new JButton ("test2");
    jcomp3 = new JButton ("test3");
    jcomp4 = new JTextField (5);

    //adjust size and set layout
    setPreferredSize (new Dimension (395, 156));
    setLayout (null);

    //add components
    add (jcomp1);
    add (jcomp2);
    add (jcomp3);
    add (jcomp4);

    //set component bounds (only needed by Absolute Positioning)
    jcomp1.setBounds (20, 45, 100, 25);
    jcomp2.setBounds (135, 60, 100, 25);
    jcomp3.setBounds (260, 35, 100, 25);
    jcomp4.setBounds (105, 115, 100, 25);
}


public static void main (String[] args) {
    JFrame frame = new JFrame ("MyPanel");
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add (new MyPanel2());
    frame.pack();
    frame.setVisible (true);
}
}

如果有人能帮忙,我会非常感激! 我非常尊重你们这些专业人士,因为如果你是这方面的专家,你可能比世界上99.9%的人都聪明。 这些东西让我头疼。

14
停止尝试随意的事情,休息一下,好好睡一晚,然后阅读Swing教程:http://docs.oracle.com/javase/tutorial/uiswing/。了解到一个JPanel必须被包含在一个JFrame或JDialog中才能显示在新窗口中,并且应用程序中只需要一个主方法,你不需要两个。 - JB Nizet
2个回答

8

在有多个表单或窗口的情况下,您可以使用JPanel作为容器,并将其设置为CardLayout。然后,您可以将两个JPanel添加到其上,并使用提供的方法访问它们。

使用Absolute Positioning时,不要使用setBounds(),这并不是将组件放置到父容器的正确方式。相反,请使用setLocation(...)setSize(...)方法。尽可能避免使用绝对定位。以下是来自Java文档的一些支持前述行的行:

尽管没有布局管理器也可以完成,但如果可能的话,应该使用布局管理器。布局管理器使得调整外观依赖组件外观、不同字体大小、容器大小变化以及不同区域设置更加容易。布局管理器还可以被其他容器以及其他程序轻松地重用。由于程序输出在任何情况下都不是令人愉悦的体验,至少使用布局管理器可以让这项工作变得更加容易,因为你不需要为每个组件指定位置和大小。尝试浏览 布局管理器教程,并尽快熟悉它们。它们是真正的生命救星 :-) 这里是从你的 源代码 中摘取的修改后的代码。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CardLayoutExample
{
    private JPanel contentPane;
    private MyPanel panel1;
    private MyPanel2 panel2;

    private void displayGUI()
    {
        JFrame frame = new JFrame("Card Layout Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setBorder(
            BorderFactory.createEmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new CardLayout());
        panel1 = new MyPanel(contentPane);
        panel2 = new MyPanel2();
        contentPane.add(panel1, "Panel 1"); 
        contentPane.add(panel2, "Panel 2");
        frame.setContentPane(contentPane);
        frame.pack();   
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new CardLayoutExample().displayGUI();
            }
        });
    }
}

class MyPanel extends JPanel {

    private JTextField How;
    private JLabel jcomp2;
    private JLabel jcomp3;
    private JButton jcomp4;
    private JPanel contentPane;

    public MyPanel(JPanel panel) {

        contentPane = panel;
        //construct components
        How = new JTextField (1);
        jcomp2 = new JLabel ("How long were you parked?");
        jcomp3 = new JLabel ("Minutes");
        jcomp4 = new JButton ("openNewWindow");

        //adjust size and set layout
        setPreferredSize (new Dimension (315, 85));
        setLayout (null);

        //set component bounds (only needed by Absolute Positioning)
        How.setBounds (245, 50, 60, 25);
        jcomp2.setBounds (35, 30, 185, 50);
        jcomp3.setBounds (250, 30, 60, 20);
        jcomp4.setLocation(0, 0);
        jcomp4.setSize(315, 25);
        jcomp4.addActionListener( new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                CardLayout cardLayout = (CardLayout) contentPane.getLayout();
                cardLayout.next(contentPane);
            }
        });

        //add components
        add (How);
        add (jcomp2);
        add (jcomp3);
        add (jcomp4);               
    }
}

class MyPanel2 extends JPanel {
    private JButton jcomp1;
    private JButton jcomp2;
    private JButton jcomp3;
    private JTextField jcomp4;

    public MyPanel2() {
        //construct components
        jcomp1 = new JButton ("test1");
        jcomp2 = new JButton ("test2");
        jcomp3 = new JButton ("test3");
        jcomp4 = new JTextField (5);

        //adjust size and set layout
        setPreferredSize (new Dimension (395, 156));
        setLayout (null);

        //set component bounds (only needed by Absolute Positioning)
        jcomp1.setBounds (20, 45, 100, 25);
        jcomp2.setBounds (135, 60, 100, 25);
        jcomp3.setBounds (260, 35, 100, 25);
        jcomp4.setBounds (105, 115, 100, 25);

        //add components
        add (jcomp1);
        add (jcomp2);
        add (jcomp3);
        add (jcomp4);       
    }
}

2
有用的例子,但您应该引导OP不要使用“null”布局。 :-) - trashgod

5

这是我的Panel类的代码,使用这个:

import java.awt.*;
 import java.awt.event.*;

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

public class MyPanel extends JPanel {
private JTextField How;
private JLabel jcomp2;
private JLabel jcomp3;
private JButton jcomp4;

public MyPanel() {
    //construct components
    How = new JTextField (1);
    jcomp2 = new JLabel ("How long were you parked?");
    jcomp3 = new JLabel ("Minutes");
    jcomp4 = new JButton ("openNewWindow");

    jcomp4.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            JFrame frame = new JFrame ("MyPanel");
            frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add (new MyPanel2());
            frame.pack();
            frame.setVisible (true);

        }
    });

    //adjust size and set layout
    setPreferredSize (new Dimension (315, 85));
    setLayout (null);

    //add components
    add (How);
    add (jcomp2);
    add (jcomp3);
    add (jcomp4);

    //set component bounds (only needed by Absolute Positioning)
    How.setBounds (245, 50, 60, 25);
    jcomp2.setBounds (35, 30, 185, 50);
    jcomp3.setBounds (250, 30, 60, 20);
    jcomp4.setBounds (0, 0, 315, 25);

       jcomp4.addActionListener( new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {

        }
    });
}


public static void main (String[] args) {
    JFrame frame = new JFrame ("MyPanel");
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add (new MyPanel());
    frame.pack();
    frame.setVisible (true);
}
}

4
在 Swing GUI 中,对象的构建和操作应 事件调度线程 上执行。 - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接