首页 文章

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

提问于
浏览
0

我正在创建一个测验并创建了一个带有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(true);}}); }

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

    我认为当你在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();
            }
        }
    }
    
  • 3

    这是你应该做的 .

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

    • 不要创建新的 JFrame 将其传递给对话框 .

    • 要在按钮上打开它,只需创建一个 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);
        }
    }
    

    Bonus

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

    • 使用Java命名约定 . class 名称以大写字母开头 .
      questionDialogQuestionDialog

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

相关问题