JTable在面板中显示一个白色框,原因不明

时间:2017-11-11 20:13:32

标签: java swing jtable

我正在为一门课程建立一个挥杆应用程序。将JTable添加到面板后,表格网格和列标题未显示。而是在表格所在的面板中出现一个白色框。为什么会发生这种情况以及如何解决?

public class ReminderGui implements ActionListener {
JFrame frame;
JPanel panel;
JLabel lblTitle,lblDetails,lblDate,lblTime;
JTextField titleField,dateField;
JTextArea detailsArea;
JButton addButton,cancelButton,rmvButton,rmvallButton,editButton;
JTable table;
JComboBox<String> hourcbo,minutecbo,ampmcbo;
ArrayList<Reminder> remList;


final String hour[]={"12","1","2","3","4","5","6","7","8","9","10","11"};
final String minute[]={"00","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20",
                     "21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40",
                     "41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59"
                    };
final String ampm[]={"AM","PM"};
String[] columnname={"Reminder Name", "Reminder Detail","Reminder Date","Reminder Time"};


public ReminderGui() throws FileNotFoundException, IOException, ClassNotFoundException{

    panel=new JPanel();
    panel.setLayout(null);

    lblTitle=new JLabel("Reminder Title");
    lblDetails=new JLabel("Reminder Details");
    lblDate=new JLabel("Set Date(date/motnth/year)");
    lblTime=new JLabel("Set Time");

    titleField=new JTextField();
    titleField.setMargin(new Insets(5,5,5,5));


    detailsArea=new JTextArea(10,20);
    detailsArea.setLineWrap(true);
    detailsArea.setMargin(new Insets(5,5,5,5));
    JScrollPane scroller1=new JScrollPane(detailsArea);
    scroller1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    scroller1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);


    //date and time component     

    dateField=new JTextField();
    dateField.setMargin(new Insets(5,5,5,5));


    hourcbo=new JComboBox<String>(hour);
    hourcbo.setBackground(Color.white);
    minutecbo=new JComboBox<String>(minute);
    minutecbo.setBackground(Color.white);
    ampmcbo=new JComboBox<String>(ampm);
    ampmcbo.setBackground(Color.white);

    addButton=new JButton("Add");
    cancelButton=new JButton("Cancel");
    editButton=new JButton("Edit");
    rmvButton=new JButton("Remove Selected");
    rmvallButton=new JButton("Remove all");  



    lblTitle.setBounds(30, 30, 100, 30);
    panel.add(lblTitle);
    titleField.setBounds(150, 30, 400, 30);
    panel.add(titleField);
    lblDetails.setBounds(30, 80, 100, 30);
    panel.add(lblDetails);
    scroller1.setBounds(150, 80, 400, 200);
    panel.add(scroller1);
    lblDate.setBounds(30, 310, 170, 30);
    panel.add(lblDate);
    dateField.setBounds(210, 310, 100, 30);
    panel.add(dateField);
    lblTime.setBounds(340, 310, 50, 30);
    panel.add(lblTime);
    hourcbo.setBounds(400, 310, 100, 30);
    minutecbo.setBounds(510, 310, 100, 30);
    ampmcbo.setBounds(620, 310, 100, 30);
    panel.add(hourcbo);
    panel.add(minutecbo);
    panel.add(ampmcbo);
    addButton.setBounds(30,380,100,30);
    panel.add(addButton);
    cancelButton.setBounds(160,380,100,30);
    panel.add(cancelButton);



    File file=new File("appFile.chk");
    Object[][] data = null;
    if(!(file.exists())){
        remList=new ArrayList<Reminder>();
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
        oos.writeObject(remList);
    oos.flush();
    oos.close();
    }

        ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
        remList=(ArrayList<Reminder>)ois.readObject();
        int rownum=remList.size();
        data=new String[rownum][4];
        Iterator<Reminder> it=remList.iterator();
        Reminder rem=null;
        for(int i=0;i<rownum;i++){
            if(it.hasNext()){
                rem=it.next();
            }

            data[i][0]=rem.getReminderTitle();
            data[i][1]=rem.getReminderDetails();
            data[i][2]=rem.getReminderDate();
            data[i][3]=rem.getReminderTime();
        }

        ois.close();



    //jtable

    table=new JTable(data,columnname);
    table.setBounds(160,450,400,300);


    JScrollPane scroller2=new JScrollPane(table);
    scroller1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    scroller1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    panel.add(table);


    addButton.addActionListener(this);
    cancelButton.addActionListener(this);
    editButton.addActionListener(this);
    rmvButton.addActionListener(this);
    rmvallButton.addActionListener(this);



    //set framesize when other works are done
    frame=new JFrame("RemindMe!");
    frame.add(panel);
    frame.setSize(850,840); 
    frame.setVisible(true);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
}

@Override
public void actionPerformed(ActionEvent e) {
    //throw new UnsupportedOperationException("Not supported yet.");
    if(e.getSource()==addButton){
        String s1=(String)titleField.getText();
        String s2=(String)detailsArea.getText();
        String s3=(String)dateField.getText();
        String s4=(String)hourcbo.getSelectedItem()+":"+(String)minutecbo.getSelectedItem()+" "+(String)ampmcbo.getSelectedItem();

    }
    else if(e.getSource()==cancelButton){
        titleField.setText("");
        detailsArea.setText("");
        dateField.setText("");

    }



}

1 个答案:

答案 0 :(得分:2)

您已将JTable添加到多个容器 - JScrollPane的视口(好)和面板JPanel(坏)。第二个操作会从JScrollPane中删除JTable,以便稍后在将JScrollPane添加到面板时,它不会保留任何内容。

JScrollPane scroller2=new JScrollPane(table);

好!

panel.add(table);

坏了!

解决方案:不要那样做。将您的组件添加到一个且仅一个容器中。

其他问题:

panel.setLayout(null);

不要使用空布局,因为这些导致脆弱的GUI在一个平台上看起来很好,而在其他平台上则不太好,而且很难调试和增强。学习和使用布局管理器。