我正在创建一个测验并创建了一个带有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();
}
}
}
答案 0 :(得分:3)
这是你应该做的。
摆脱main
课程中的JDialog
方法。您的应用程序应该只有一个 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);
}
}
<强>加成强>
您收到questionDialog.setVisible(true)
错误,因为setVisible
是一种实例方法,并且您尝试以静态方式调用它。您需要创建一个对话框类的new
实例来调用它。
使用Java命名约定。班级名称以大写字母开头。
questionDialog
→QuestionDialog
答案 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();
}
}
}