如何使用JFrame按钮启动第二个JFrame而不在Java中启动更多JFrame?

时间:2014-02-16 03:55:42

标签: java swing jframe actionlistener

我的程序应该启动第二个JFrame并在单击按钮时打印一个语句,但它总是启动三个JFrame并打印三个语句。我需要它只打印一个语句并启动一个Jframe。这是代码:

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

@SuppressWarnings("serial")
public class Test extends JPanel implements ActionListener {
    JButton button = new JButton();
    String buttonString = "Buttontext";

    public Test() {
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        button.setText("Buttontext");
        button.setCursor(Cursor.getDefaultCursor());
        button.setMargin(new Insets(0, 0, 0, 0));
        button.setBounds(700, 400, 100, 20);
        button.setActionCommand(buttonString);
        button.addActionListener(this);
        this.add(button);
    }

    public static void createandshowGUI() {
        JFrame frame = new JFrame("Frame");
        frame.getContentPane().setBackground(Color.white);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setSize(dim.width, dim.height);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new Test());
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createandshowGUI();
            }
        });
    }

    public void actionPerformed(ActionEvent e) {
        if (buttonString.equals(e.getActionCommand())) {
            System.out.println("creating a new frame");
            newframe();
        }
    }

    public void newframe() {
        JFrame frame2 = new JFrame();
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        frame2.setSize(dim.width / 2, dim.height / 2);
        frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame2.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame2.setVisible(true);
    }
}

4 个答案:

答案 0 :(得分:2)

您继续在ActionListener方法中向button添加paintComponent(Graphics)。这意味着每次调用此方法时,都会在按钮中添加另一个ActionListener。因此,每次按下按钮时,它会执行相同的操作,但是在按下按钮之前调用该方法很多次。

答案 1 :(得分:2)

首先看The Use of Multiple JFrames, Good/Bad Practice? - 这里流行的答案是坏的。

更清晰的方法是使用CardLayout在不同的JPanel之间切换。以下可运行的示例可以是here。另请参阅How to Use CardLayout

enter image description here


另一种方法是使用模态 JDialog。可以看到以下可运行的示例here。另请参阅How to Use Make Dialogs

enter image description here

答案 2 :(得分:2)

每次要求面板自行绘制时,都会调用

paintComponent()。该请求的发生有很多原因 - 包括重新绘制面板(如果另一个窗口已移动到其上),或者面板是否已调整大小。 paintComponent()中的任何代码都应用于绘制组件。

所以,这不是button.addActionListener()的正确位置。事实上,您的所有button代码(包括this.add(button))都应该发生在其他地方,可能是createandshowGUI

您的程序无需覆盖paintComponent()。您可以依靠JPanel来绘制已添加到其中的所有组件(事实上,super.paintComponent()就是这样做的)。如果您在绘制面板时执行了一些独特的操作(例如,在面板中放置背景图像),则只需覆盖paintComponent()。在您的情况下,您只需将按钮添加到面板即可。

答案 3 :(得分:0)

如果要创建多个窗口,请使用JDesktopPane。根据需要向他们添加JInternalFrame。这样你就会有一个单独的顶级窗口,里面有子窗口。