2014-03-26 91 views
0

我正在創建一個測驗,並創建了一個帶有JFrame的類,類似於主菜單。在這個菜單上,我創建了一個JButton,我想打開單獨的JDialog(它將包含問題等)。在一個類中打開JButton打開單獨的JDialog類

的JDialog的是一個名爲questionDialog.java

一個單獨的類,我相信,你必須執行一個動作監聽器調用調用setVisible(真),但是當我這樣做,我得到一個不能使靜態引用非靜態方法設置錯誤。

任何幫助將不勝感激,我使用Eclipse和Jigloo是用於GUI

這裏是我的代碼在我的主菜單JFrame類,專門爲我要打開按鈕的代碼,新的JDialog 公衆靜態無效的主要(字串[] args){ SwingUtilities.invokeLater(新的Runnable(){ 公共無效的run(){ NewJFrame研究所=新NewJFrame(); inst.setLocationRelativeTo(空); 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(); 
     } 
    }  
} 
+1

您發佈的代碼沒有錯誤。你究竟在哪裏看到錯誤? –

+0

@peeskillet我也沒有看到錯誤。我認爲@ user3455584正試圖通過調用'questionDialog.setVisible(true)'來打開questionDialog。是這樣嗎? – SharpKnight

+0

@SharpKnight是的,這是正確的,但是當我嘗試這樣做時,我得到了上述錯誤 – user3455584

回答

3

代碼的代碼下面是你應該做的。

  1. 擺脫在JDialogmain方法。您的申請應該只有一個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

+0

?當你這樣說的時候,你把我扔了一下! – user3455584

+0

不,我的意思是'JFrame frame = new JFrame()'。你不需要那個。沒用的。你想引用主類JFrame而不是'新JFrame'。我的代碼顯示如何做到這一點 –

+0

啊,我看到了。現在對我來說它更有意義,我的想法似乎已經空白。我的最後一個問題是在我的主類或我的questionDialog類中實現類似的代碼版本? – user3455584

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

我認爲這很可能是你正在試圖做一些事情的非靜態成員,而你在主(其中是一種靜態方法)。您應該使用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(); 
     } 
    } 
}