使JButton在一个类中打开单独的QDialog类

时间:2014-03-26 13:18:41

标签: java eclipse swing

我正在创建一个测验并创建了一个带有JFrame的类,其类似于主菜单。在这个菜单上,我创建了一个JButton,我想打开单独的JDialog(它将包含问题等)。

JDialog是一个名为questionDialog.java的单独类

我相信你必须实现一个调用setVisible(true)的动作监听器,但是当我这样做时,我得到一个无法对非静态方法setvisible错误进行静态引用。

我将非常感谢任何帮助,我使用eclipse和Jigloo作为GUI

这是我的主菜单JFrame类中的代码,特别是我要打开新JDialog的按钮的代码      public static void main(String [] args){         SwingUtilities.invokeLater(new Runnable(){             public void run(){                 NewJFrame inst = new NewJFrame();                 inst.setLocationRelativeTo(NULL);                 inst.setVisible(真);             }         });     }

 startButton = new JButton();
        getContentPane().add(startButton);
        startButton.setText("Start Quiz");
        startButton.setBounds(454, 239, 65, 23);

这是给我错误的代码

startButton = new JButton();
        getContentPane().add(startButton);
        startButton.setText("Start Quiz");
        startButton.setBounds(454, 239, 65, 23);
        startButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent actionevent)
            {
                questionDialog.setVisible(true);
            }
        });

以下是单独JDialog类的代码

package ZillionaireGUI;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class questionDialog extends javax.swing.JDialog {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                questionDialog inst = new questionDialog(frame);
                inst.setVisible(true);
            }
        });
    }

    public questionDialog(JFrame frame) {
        super(frame);
        initGUI();
    }

    private void initGUI() {
        try {
            setSize(400, 300);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    
}

3 个答案:

答案 0 :(得分:3)

这是你应该做的。

  1. 摆脱main课程中的JDialog方法。您的应用程序应该只有一个 main方法,并且应该在您的JFrame类中。

  2. 请勿创建新的JFrame以将其传递到对话框。

  3. 要在按钮上打开它,只需创建一个new questionDialog()将当前帧传递给它。像这样的东西

    public class MyFrame extends JFrame {
       public MyFrame() {
           JButton but = new JButton("but");
           but.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e) {
                   QuestionDialog dialog = new QuestionDialog(MyFrame.this);
                   dialog.setVisible(true);
               }
           });
       }
    
       public static void main(String[] args) {
           SwingUtilities.invokeLater(new Runnable(){
               public void run() {
                   new MyFrame();
               } 
           });
       }
    }
    
    public class QuestionDialog extends JDialog {
        public QuestionDialog(Frame parent) {
            super(parent);
        }
    }
    

  4. <强>加成

    • 您收到questionDialog.setVisible(true)错误,因为setVisible是一种实例方法,并且您尝试以静态方式调用它。您需要创建一个对话框类的new实例来调用它。

    • 使用Java命名约定。班级名称以大写字母开头。
      questionDialogQuestionDialog

答案 1 :(得分:0)

在主菜单中输入以下内容

 startButton.addActionListener(new ActionListener()
 {  
    public void actionPerformed(ActionEvent e)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
               JFrame frame = new JFrame();
               questionDialog inst = new questionDialog(frame);
               inst.setVisible(true);
            }
        });
    }
 });

答案 2 :(得分:0)

我认为当您在main(这是一种静态方法)时,您可能正在尝试对非静态成员执行某些操作。您应该只使用main来创建一个实例,然后调用该实例的某个方法。我在下面列出了一些工作代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Zillionaire extends JFrame implements ActionListener {

    JButton startButton;

    public static void main(String[] args) {
        Zillionaire zillionaire = new Zillionaire();
        zillionaire.init();
    }

    private void init() {
        startButton = new JButton();
        // Removed: we just use add now, and bets to do this last.
//        getContentPane().add(startButton); 
        startButton.setText("Start Quiz");
        startButton.setBounds(454, 239, 65, 23);
        startButton.addActionListener(this);
        // Add after the button is configured, not before
        add(startButton);

        // This just makes our JFrame pretty and visible
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

    }

    // Anything that implements the ActionListener interface can listen
    // for the button being pressed and activate the JDialog
    @Override
    public void actionPerformed(ActionEvent ae) {
        System.out.println("Button pressed, but Dialog doesn't do much");
        QuestionDialog questionDialog = new QuestionDialog(this);
    }

}

class QuestionDialog extends javax.swing.JDialog {

    public QuestionDialog(JFrame frame) {
        super(frame);
        initGUI();
    }

    // Set it visible when we make our GUI
    private void initGUI() {
        try {
            setSize(400, 300);
            // Added so we can see something
            add(new JLabel("I should add something!"));
            setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}