2017-11-11 3 views
0

Ich baue eine Swing-Anwendung für einen Kurs. Nachdem ich meine JTable zum Panel hinzugefügt habe, werden die Tabellenraster und Spaltenüberschriften nicht angezeigt. Stattdessen erscheint eine weiße Box in der Tafel, wo der Tisch sein sollte. Warum passiert das und wie kann man es reparieren?JTable zeigt aus unbekannten Gründen eine weiße Box im Panel

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(""); 

    } 



} 

Antwort

2

Sie haben die JTable auf mehr als einen Behälter gegeben - sowohl das Ansichtsfenster des JScrollPane (gut) und auch auf das Panel JPanel (sehr schlecht). Diese zweite Aktion entfernt die JTable aus dem JScrollPane, so dass später, wenn Sie die JScrollPane zu Panel hinzufügen, es nichts enthält.

JScrollPane scroller2=new JScrollPane(table); 

Gut!

panel.add(table); 

Schlecht!

Lösung: Tu das nicht. Fügen Sie Ihre Komponenten einem einzelnen Container hinzu.

Andere Probleme:

panel.setLayout(null); 

nicht null Layouts Verwenden Sie, wie diese führen zu zerbrechlich GUIs, die auf einer Plattform Art-of OK aussehen und nicht so gut auf andere, und die sind sehr schwer zu debuggen und verbessern. Lernen und verwenden Sie die Layout-Manager.

+0

Was das Problem gelöst hat, ist das Festlegen von Grenzen zu scroller2 statt Tabelle. Aber danke für deine Hilfe und Anregung. –

+1

@NirjharDasgupta: Im Ernst, benutze keine Null-Layouts und setBounds, da du dich damit auf Herzschmerz einstellst. –

+1

* "Was das Problem gelöst hat, ist das Festlegen von Grenzen zu scroller2 statt Tabelle." * Wie gedenken Sie die 5+ Probleme zu lösen, die sich aus der Verwendung von keinem Layout ergeben? Java-GUIs müssen auf verschiedenen Betriebssystemen, Bildschirmgrößen, Bildschirmauflösungen usw. mit verschiedenen PLAFs in verschiedenen Locales arbeiten. Als solche sind sie nicht für ein perfektes Pixel-Layout geeignet. Verwenden Sie stattdessen Layout-Manager oder [Kombinationen davon] (http://stackoverflow.com/a/5630271/418556) zusammen mit Layout-Auffüllung und Rahmen für [Leerraum] (http://stackoverflow.com/a/17874718/ 418556). Im Ernst, folgen Sie der Strategie von @HovercraftFullOfEels. –

Verwandte Themen