2017-01-30 115 views
0

我目前正在研究一個Java程序,並且程序沒有顯示任何內容。JFrame窗口拒絕打開

內的主要方法是如下代碼:

WindowClient client = new WindowClient(); 
    client.pack(); 
    client.setVisible(true); 

而且WindowClient:

import javax.swing.JFrame; 
import java.awt.GridBagLayout; 
import javax.swing.SpringLayout; 

import org.datacontract.schemas._2004._07.NaturalDisasterService.NaturalDisaster; 
import org.tempuri.INaturalDisasterServiceProxy; 

import java.awt.BorderLayout; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import java.awt.Font; 

import javax.swing.DefaultListModel; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.rmi.RemoteException; 
import java.awt.event.ActionEvent; 

public class WindowClient extends JFrame { 
    private INaturalDisasterServiceProxy ndsp; 
    private JTextField textDisasterName; // text box on insertPanel for disaster names 
    private JTextField textDisasterDescription; // text box on insertPanel for disaster descriptions 
    public JPanel insertPanel, detailPanel; 
    public JList list; // the list 
    public JLabel lblDisasterNameStaticInsert, //displays text "Disaster Name:" on insertPanel 
     lblDisasterDescStaticInsert, // displays text "Disaster Description:" on insertPanel 
     lblDisasterDescDataDetail, // displays disaster description from database on detailPanel 
     lblDisasterDescStaticDetail; // label displays text "Disaster Desc:" on detailPanel 
    public WindowClient() { 
    buildWindow(); 
    ndsp = new INaturalDisasterServiceProxy(); 
    ndsp.setEndpoint("url redacted"); 
    updateList(); 

    } 

    /** 
    * @param args 
    */ 

    public void getSelection() { 
    showDetailPanel(); 
    } 

    public void insertLoad() { 
    if (detailPanel.isVisible()) { 
     hideDetailPanel(); 
    } 
    showInsertPanel(); 
    } 

    public void saveToDB() { 
    hideInsertPanel(); 

    } 

    public void updateList() { 

    NaturalDisaster nds[]; 
    try { 
     nds = ndsp.getData(); 

     DefaultListModel model = new DefaultListModel(); 
     for(NaturalDisaster disaster : nds){ 
     model.addElement(disaster.getDisasterName()); 
     } 
     getContentPane().remove(list); 
     list = new JList(model); 
     list.setBounds(81, 11, 247, 132); 
     getContentPane().add(list); 
     getContentPane().repaint(); 
     getContentPane().revalidate(); 


    } catch (RemoteException e) { 
     // TODO Auto-generated catch block 
     System.out.println(e.getMessage()); 
     //e.printStackTrace(); 
    } 

    } 

    public void buildWindow() { 
    getContentPane().setLayout(null); 

    list = new JList(); 
    list.setBounds(81, 11, 247, 132); 
    getContentPane().add(list); 

    insertPanel = new JPanel(); 
    insertPanel.setBounds(10, 150, 414, 67); 
    getContentPane().add(insertPanel); 
    insertPanel.setLayout(null); 

    detailPanel = new JPanel(); 
    detailPanel.setBounds(10, 150, 414, 67); 
    detailPanel.setLayout(null); 

    // Label for disaster names on insertPanel 
    lblDisasterNameStaticInsert = new JLabel("Disaster Name:"); 
    lblDisasterNameStaticInsert.setFont(new Font("Tahoma", Font.BOLD, 11)); 
    lblDisasterNameStaticInsert.setBounds(10, 5, 105, 14); 
    insertPanel.add(lblDisasterNameStaticInsert); 

    // label for disaster descripitons on the insertPanel 
    lblDisasterDescStaticInsert = new JLabel("Disaster Description:"); 
    lblDisasterDescStaticInsert.setFont(new Font("Tahoma", Font.BOLD, 11)); 
    lblDisasterDescStaticInsert.setBounds(10, 30, 120, 14); 
    insertPanel.add(lblDisasterDescStaticInsert); 

    // text boxes on the insertPanel 
    textDisasterName = new JTextField(); 
    textDisasterName.setBounds(138, 2, 266, 20); 
    insertPanel.add(textDisasterName); 
    textDisasterName.setColumns(10); 

    textDisasterDescription = new JTextField(); 
    textDisasterDescription.setBounds(138, 27, 266, 20); 
    insertPanel.add(textDisasterDescription); 
    textDisasterDescription.setColumns(10); 
    getContentPane().add(detailPanel); 

    // label for the disaster description from database on display panel 
    lblDisasterDescDataDetail = new JLabel("New label"); 
    lblDisasterDescDataDetail.setBounds(10, 30, 120, 14); 
    detailPanel.add(lblDisasterDescDataDetail); 

    // label displays text "Disaster Desc:" on display panel 
    lblDisasterDescStaticDetail = new JLabel("Disaster Desc:"); 
    lblDisasterDescStaticDetail.setBounds(10, 5, 105, 14); 
    detailPanel.add(lblDisasterDescStaticDetail); 

    JButton btnGetSelection = new JButton("Get Selection"); 
    btnGetSelection.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     getSelection(); 
     } 
    }); 
    btnGetSelection.setBounds(10, 228, 105, 23); 
    getContentPane().add(btnGetSelection); 

    JButton btnInsert = new JButton("Insert"); 
    btnInsert.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     insertLoad(); 
     } 
    }); 
    btnInsert.setBounds(125, 228, 124, 23); 
    getContentPane().add(btnInsert); 

    JButton btnSave = new JButton("Save Info to DB"); 
    btnSave.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     saveToDB(); 
     } 
    }); 

    btnSave.setBounds(259, 228, 165, 23); 
    getContentPane().add(btnSave); 
    //getContentPane().setVisible(true); 
    } 

    public void hideInsertPanel() { 
    getContentPane().remove(insertPanel); 
    insertPanel.setVisible(false); 
    } 

    public void showInsertPanel() { 
    getContentPane().add(insertPanel); 
    insertPanel.setVisible(true); 
    insertPanel.getParent().revalidate(); 
    } 

    public void hideDetailPanel() { 
    getContentPane().remove(detailPanel); 
    detailPanel.setVisible(false); 
    } 

    public void showDetailPanel() { 
    getContentPane().add(detailPanel); 
    detailPanel.setVisible(true); 
    detailPanel.getParent().revalidate(); 
    } 

} 

一些對JFrame的故障問題的其他問題提到需要setVisible()pack(),但我已經完成了這兩個電話。唯一的結果是程序運行,並且程序在Windows任務欄中打開,但沒有相應的窗口(如果程序被選爲活動狀態,預覽顯示一個不顯示的細白條)。

雖然不是主要問題,但這是我在幾年內首次與Swing合作,所以請隨時指出其他錯誤。

+2

當我1)註釋掉自定義類2)通過註釋掉它們出現的行來修正所有產生的編譯錯誤,3)在主類中添加「主代碼」作爲該類的主體,我看到: GUI。當我拖動大小時,我可以看到組件。爲了儘快提供更好的幫助,請發佈[MCVE]或[簡短,獨立,正確的示例](http://www.sscce.org/)。 –

+2

BTW:Java GUI必須在不同的語言環境中使用不同的PLAF來處理不同的操作系統,屏幕大小,屏幕分辨率等。因此,它們不利於像素的完美佈局。請使用佈局管理器或[它們的組合](http://stackoverflow.com/a/5630271/418556)以及[white space]的佈局填充和邊框(http://stackoverflow.com/a/17874718/ 418556)。 **來自[此圖像](https://i.stack.imgur.com/uKThv.png)的注意事項文本區域未居中且一個按鈕的文本是否被截斷? * –

+2

只有當您的內容使用佈局管理API時,'pack'纔會起作用 – MadProgrammer

回答

1
getContentPane().setLayout(null); 

此行表示您已禁用佈局管理器。既然你不使用任何,你的容器不會自動調整你的組件的大小,這就是爲什麼你什麼都看不到。

如果更改此行:

getContentPane().setLayout(new FlowLayout()); 

,並刪除空的JPanel對象的佈局等電話,你會看到運行的組件。

這裏的guide簡要解釋了每個佈局管理器的工作方式。

+0

謝謝,這解決了它。我試圖使用絕對佈局,並假設這不起作用。 –