2013-10-09 52 views
1

好吧,這裏就是謙遜。我使用Java Swing已經很長時間了,所以我知道這個問題有一些非常明顯的解決方案。我想要做的是讓所有這些不同的擺動元素出現在窗口中。當我運行代碼時,沒有任何反應。我什麼都看不到。每當我回答Google的答案時,我都會得到關於各種複雜的JPanel問題的東西,而且我幾乎是積極的,這不是一個難題。所以這是我的代碼:Java Swing Window不會出現

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 


public class LimoSysDriver extends JFrame implements ActionListener { 

    /** 
    * @param args 
    */ 
    JLabel title = new JLabel("Thread Test Application"); 

    JLabel numOne = new JLabel("1"); 
    JLabel numTwo = new JLabel("2"); 
    JLabel numThr = new JLabel("3"); 
    JLabel numFou = new JLabel("4"); 

    JProgressBar progOne = new JProgressBar(); 
    JProgressBar progTwo = new JProgressBar(); 
    JProgressBar progThr = new JProgressBar(); 
    JProgressBar progFou = new JProgressBar(); 

    JLabel counterOne = new JLabel(Integer.toString(progOne.getValue())); 
    JLabel counterTwo = new JLabel(Integer.toString(progTwo.getValue())); 
    JLabel counterThr = new JLabel(Integer.toString(progThr.getValue())); 
    JLabel counterFou = new JLabel(Integer.toString(progFou.getValue())); 

    JLabel numGrandTot = new JLabel("Grand Total"); 
    JLabel counterTot = new JLabel(); 

    JButton start = new JButton(); 
    JButton pause = new JButton(); 
    JButton resume = new JButton(); 


    public LimoSysDriver(){ 
     setSize(700,300); 
     JPanel pane = new JPanel(); 
     pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS)); 
     add(pane); 
     JPanel lowerPanel = new JPanel(); 
     lowerPanel.setLayout(new BoxLayout(lowerPanel, BoxLayout.LINE_AXIS)); 
     add(lowerPanel); 

     pane.add(title); 
     pane.add(numOne); 
     pane.add(progOne); 
     pane.add(counterOne); 

     pane.add(numTwo); 
     pane.add(progTwo); 
     pane.add(counterTwo); 

     pane.add(numThr); 
     pane.add(progThr); 
     pane.add(counterThr); 

     pane.add(numFou); 
     pane.add(progFou); 
     pane.add(counterFou); 


    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     LimoSysDriver window = new LimoSysDriver(); 

    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

} 

問題是,窗口根本沒有顯示出來。一旦我能把它整理出來,我就可以解決其餘的問題。在此先感謝大家。

回答

2

您需要將其設置爲可見。用途:

setVisible(true) 
+0

確保您在將所有內容添加到要顯示的窗格後結束操作 – Levenal

2

一些提示:

  • 需要,使您看到調用JFramesetVisible(true)

  • 而不是add(pane)可以使用setContentPane(pane)更換作爲內容窗格中的默認容器。

  • 不要忘記調用pack()方法,當你完成添加組件,使您的JFrame可見之前..

  • Event Dispatch Thread創建GUI對象使用SwingUtilities.invokeLater()

  • 避免JFrame延長,除非你需要添加一些功能。如果不是這種情況,請改用JFrame變量或類成員。

+0

感謝您的回覆。我曾被告知使用SwingUtilities。請問爲什麼?優點是什麼?我相信你是對的。我只想更全面地理解。此外,這種方法是否允許您爲每個對象指定特定的線程?我想爲每個進度條都有一個線程,但是我一直無法使其工作。 - - - 沒關係!我正在閱讀API,我明白了。感謝您的幫助! – Rambo8000

+0

Swing組件應該始終在一個名爲Event Dispatch Thread的單個特殊線程中創建更新。這是必要的,因爲大多數Swing對象方法不是「線程安全的」。關於進度條我建議你使用[SwingWorker](http://www.javacreed.com/swing-worker-example/),它提供了在後臺線程中執行長任務的方法,並更新了Swing組件(進度條)在美國東部時間。 – dic19

+0

太棒了。謝謝! – Rambo8000