2010-10-02 2 views
0

У меня есть GridBagLayout, но один ярлык (maxSizeLbl) сходит с ума, а другой (maxDateLbl) не виден, кто-нибудь знает, что я сделал неправильно?GridBagLayout сходит с ума

Вот фото:

alt text

А вот код:

import java.awt.Component; 
import java.awt.Container; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 


public class SearchGUI { 
    public static void main(String args[]) { 
     JFrame frame = new JFrame("Search Files"); 
     JPanel panel = new JPanel(); 
     JTextField rootTF = new JTextField(20); 
     JTextField containsTF = new JTextField(20); 
     JTextField containsNotTF = new JTextField(20); 
     JTextField minSizeTF = new JTextField(10); 
     JTextField maxSizeTF = new JTextField(10); 
     JTextField suffixTF = new JTextField(10); 
     JTextField prefixTF= new JTextField(10); 
     JTextField minDateTF = new JTextField(10); 
     JTextField maxDateTF = new JTextField(10); 
     JCheckBox hiddenCB = new JCheckBox("search hidden"); 
     JCheckBox recursiveCB = new JCheckBox("search subfolders"); 
     JButton searchBtn = new JButton("search"); 
     JLabel rootLbl = new JLabel("search in: ", JLabel.CENTER); 
     JLabel containsLbl = new JLabel("Filename contains: ", JLabel.CENTER); 
     JLabel containsNotLbl = new JLabel(" Filename contains not", JLabel.CENTER); 
     JLabel minSizeLbl = new JLabel("min. Size", JLabel.CENTER); 
     JLabel maxSizeLbl = new JLabel("max. Size", JLabel.CENTER); 
     JLabel suffixLbl = new JLabel("Filetypes", JLabel.CENTER); 
     JLabel prefixLbl = new JLabel("begins with", JLabel.CENTER); 
     JLabel minDateLbl = new JLabel("min. Date", JLabel.CENTER); 
     JLabel maxDateLbl = new JLabel("max Date", JLabel.CENTER); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Container c = frame.getContentPane(); 
     GridBagLayout gbl = new GridBagLayout(); 
     c.setLayout(gbl); 


//  addComponent(c, gbl,); 
     //                x y w h wx wy 
     addComponent(c, gbl,    rootLbl, 0, 0, 2, 1, 1.0, 0.0); 
     addComponent(c, gbl,     rootTF, 0, 1, 2, 1, 1.0, 0.0); 
     addComponent(c, gbl,   containsLbl, 0, 2, 2, 1, 1.0, 0.0); 
     addComponent(c, gbl,   containsTF, 0, 3, 2, 1, 1.0, 0.0); 
     addComponent(c, gbl, containsNotLbl, 0, 4, 2, 1, 1.0, 0.0); 
     addComponent(c, gbl,  containsNotTF, 0, 5, 2, 1, 1.0, 0.0); 
     addComponent(c, gbl,   minSizeLbl, 0, 6, 1, 1, 1.0, 0.0); 
     addComponent(c, gbl,   maxSizeLbl, 1, 6, 1, 1, 1.0, 0.0); 
     addComponent(c, gbl,   minSizeTF, 0, 7, 1, 1, 1.0, 0.0); 
     addComponent(c, gbl,   maxSizeTF, 1, 7, 1, 1, 1.0, 0.0); 
     addComponent(c, gbl,    suffixLbl, 0, 8, 2, 1, 1.0, 0.0); 
     addComponent(c, gbl,     suffixTF, 0, 9, 2, 1, 1.0, 0.0); 
     addComponent(c, gbl,   minDateLbl, 0, 10, 1, 1, 1.0, 0.0); 
     addComponent(c, gbl,   maxSizeLbl, 1, 10, 1, 1, 1.0, 0.0); 
     addComponent(c, gbl,    minDateTF, 0, 11, 1, 1, 1.0, 0.0); 
     addComponent(c, gbl,   maxDateTF, 1, 11, 1, 1, 1.0, 0.0); 
     addComponent(c, gbl,    searchBtn, 0, 12, 2, 1, 1.0, 0.0); 

     frame.setSize(gbl.preferredLayoutSize(c)); 
     frame.setVisible(true); 

    } 
    static void addComponent(Container cont, 
      GridBagLayout gbl, 
      Component c, 
      int x, int y, 
      int width, int height, 
      double weightx, double weighty) 
    { 
       GridBagConstraints gbc = new GridBagConstraints(); 
       gbc.fill = GridBagConstraints.BOTH; 
       gbc.gridx = x; gbc.gridy = y; 
       gbc.gridwidth = width; gbc.gridheight = height; 
       gbc.weightx = weightx; gbc.weighty = weighty; 
       gbl.setConstraints(c, gbc); 
       cont.add(c); 
    } 

} 

Спасибо заранее.

ответ

2

Удостоверьтесь, что вы тщательно изучили незаменимый учебник GridBagLayout в http://madbean.com/anim/totallygridbag/.

Кажется, что вы не используете IDE. Eclipse показывает любопытную желтую строку squiggly ниже maxDateLbl - она ​​не используется. И если вы нажмете на maxSizeLbl, вы увидите, что он используется дважды.

Заменить второй maxSizeLbl на maxDateLbl.

И еще раз посмотрите учебник.

2

Включая открытие Geoffrey о maxSizeLbl/maxDateLbl, это то, что сработало для меня, и предполагает, что метки полей занимают левую часть текстового поля, а не верх. (Только соответствующий раздел кода показано на рисунке.)


addComponent(c, gbl,  rootLbl, 0, 0, 1, 1, 1.0, 0.0); 
addComponent(c, gbl,   rootTF, 1, 0, 3, 1, 1.0, 0.0); 

addComponent(c, gbl, containsLbl, 0, 1, 1, 1, 1.0, 0.0); 
addComponent(c, gbl,  containsTF, 1, 1, 3, 1, 1.0, 0.0); 

addComponent(c, gbl, containsNotLbl, 0, 2, 1, 1, 1.0, 0.0); 
addComponent(c, gbl, containsNotTF, 1, 2, 3, 1, 1.0, 0.0); 

addComponent(c, gbl,  minSizeLbl, 0, 3, 1, 1, 1.0, 0.0); 
addComponent(c, gbl,  minSizeTF, 1, 3, 1, 1, 1.0, 0.0); 
addComponent(c, gbl,  maxSizeLbl, 2, 3, 1, 1, 1.0, 0.0); 
addComponent(c, gbl,  maxSizeTF, 3, 3, 1, 1, 1.0, 0.0); 

addComponent(c, gbl,  suffixLbl, 0, 4, 1, 1, 1.0, 0.0); 
addComponent(c, gbl,  suffixTF, 1, 4, 3, 1, 1.0, 0.0); 

addComponent(c, gbl,  minDateLbl, 0, 5, 1, 1, 1.0, 0.0); 
addComponent(c, gbl,  minDateTF, 1, 5, 1, 1, 1.0, 0.0); 
addComponent(c, gbl,  maxDateLbl, 2, 5, 1, 1, 1.0, 0.0); 
addComponent(c, gbl,  maxDateTF, 3, 5, 1, 1, 1.0, 0.0); 

addComponent(c, gbl,  searchBtn, 0, 6, 4, 1, 1.0, 0.0); 

+0

Я забыл добавить, что вы можете захотеть использовать «frame.pack();» в качестве замены для «frame.setSize» (gbl.preferredLayoutSize (c)); , в противном случае часть окна просмотра обрезается. – JTP

3

Вы добавили maxSizeLbl дважды (вместо maxDateLbl)