2017-01-30 117 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

谢谢,这解决了它。我试图使用绝对布局,并假设这不起作用。 –