我正在为一门课程建立一个挥杆应用程序。将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("");
}
}
答案 0 :(得分:2)
您已将JTable添加到多个容器 - JScrollPane的视口(好)和面板JPanel(坏)。第二个操作会从JScrollPane中删除JTable,以便稍后在将JScrollPane添加到面板时,它不会保留任何内容。
JScrollPane scroller2=new JScrollPane(table);
好!
panel.add(table);
坏了!
解决方案:不要那样做。将您的组件添加到一个且仅一个容器中。
其他问题:
panel.setLayout(null);
不要使用空布局,因为这些导致脆弱的GUI在一个平台上看起来很好,而在其他平台上则不太好,而且很难调试和增强。学习和使用布局管理器。