2013-02-19 10 views
8

CSE 205 (Java programlama 2) sınıfım için gerçekten basit bir GUI uygulaması tasarlamalıyız. Swing'le oldukça tanıdık, birkaç projemi daha önce kullanmıştım. Ben birkaç sorun ile program tasarladık ve Eclipse çalıştırdığınızda benim bilgisayarda mükemmel görünüyor:Bilgisayarımdaki çalıştırmayla çalıştırırken neden kullanıcı arayüzüm biçimlendirmeyi kaybediyor (Java Swing)?

enter image description here

Ama internetten bu tarayıcısında çalışır nereye teslim geldiğimde UI ağır olur kaçık, varsayılan geri dönen:

enter image description here

nedeniyle sadelik için GridBagLayout kullanarak alışık büyüdüğümüz. Ben burada kullanıyorum. CreatePanel ve SelectPanel sınıfları (ilk resimde görüldüğü gibi) hem JPanel'i (profesöre göre) genişletir.

//Call the method addItem() to add the create button to the panel 
addItem(this, createB,0,2,2,1,defaultInset,GridBagConstraints.CENTER); 



//------- 
    public void addItem(JPanel p, JComponent c, int x, int y, int width, int height, int[] inset, int align) 
     { 
      GridBagConstraints gc = new GridBagConstraints(); 
      gc.gridx = x; 
      gc.gridy = y; 
      gc.gridwidth = width; 
      gc.gridheight = height; 
      gc.weightx = 0; 
      gc.weighty = 0; 
      gc.insets = new Insets(inset[0],inset[1],inset[2],inset[3]); 
      gc.anchor = align; 
      gc.fill = GridBagConstraints.NONE; 
      p.add(c, gc); 
     } 

Herkes çıkabilirimama ne bir fikrin var: Her için

this.setLayout(new GridBagLayout()); 

Ve ve bileşenleri: Her kullanılarak ayarlanabilir? Yarimdan fazlasi göz önüne alindigimda, düzenleri dogru bir sekilde görmek için harcaniyordu, basit bir düzeltmeyi çok isterim. Gerekirse daha fazla kod gönderebilirim. Önerileriniz için teşekkürler.

--EDIT--

Tamam Etrafa @ MadProgrammer önerilerini bağlı yürütme biraz yaptık. Sanırım sorunun nerede olduğunu daralttım. Ben belirleme gibi başka bir şey için kodunu değiştirmek Şimdi eğer

petTypeTF = new JTextField(""); 
petTypeTF.setPreferredSize(new Dimension(125, 60)); 

:

Bu etiketinin "Enter sağına bir tan türü JTextField boyutunu belirlemek için kullanıyorum kodudur sütun sayısı:

petTypeTF = new JTextField("",12); 
petTypeTF.setPreferredSize(new Dimension(125, 60)); 

Ben İnternetten gönderdiğinizde bir aynı görünüyor bir UI olsun sütun sayısı o kadar vidalama gibi görünüyor ayarı ile ilgisi şey bunun için daraltmak yardımcı olur mu.. kimse?

+0

Birçok neden. Alanların varsayılan sütunlarla (ve metin alanı durumunda satırlar) oluşturulmadığını hayal ediyorum. Bölmeyi sekme üzerine yerleştirmek için kullanılan düzen yöneticisi olabilir ... – MadProgrammer

+0

Böyle bir şeyden korkuyordum. Denemek istediğim önerilerin var mı? – rphello101

+0

Çalışmak için bir örnek olmak zordur, ancak ... metin bileşenlerinin sütun/satır değerleri ile oluşturulduğundan emin olun. Bileşeni sekmeye yerleştirmek ve – MadProgrammer

cevap

9

Sorunun tam kapsamını belirlemek için gerçekten yeterli kod yok, ancak birkaç fikir yardımcı olabilir.

GridBagLayout, mümkünse tercih edilen boyutlara göre yerleştirilmesi için bileşenlerini denemek isteyecektir. Eğer yapamazsa, bunun yerine minimum boyuta bakacaktır.

Metin bileşenlerinizi, sütunlar (ve metin alanı durumunda) satırlarıyla oluşturduğunuzdan emin olun. Bu, bileşenlerin tercih edilen boyutunu bir dizi önemli faktöre dayanarak otomatik olarak oluşturacaktır.

public class BadLayout11 { 

    public static void main(String[] args) { 
     new BadLayout11(); 
    } 

    public BadLayout11() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception ex) { 
       } 

       JTabbedPane pane = new JTabbedPane(); 
       pane.add("Pet List Creation", new TestPane()); 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(pane); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 

      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 

      setLayout(new GridBagLayout()); 

      JPanel fields = new JPanel(new GridBagLayout()); 

      JTextField field = new JTextField(12); 
      JTextArea area = new JTextArea(10, 20); 
      JLabel label = new JLabel("Enter a Pet Type"); 
      JButton button = new JButton("Create a Pet"); 

      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.insets = new Insets(2, 2, 2, 2); 
      gbc.anchor = GridBagConstraints.WEST; 

      fields.add(label, gbc); 
      gbc.weightx = 1; 
      gbc.gridx++; 
      fields.add(field, gbc); 

      gbc.fill = GridBagConstraints.NONE; 
      gbc.gridx = 0; 
      gbc.weightx = 0; 
      gbc.gridy++; 
      gbc.gridwidth = 2; 
      gbc.anchor = GridBagConstraints.CENTER; 
      fields.add(button, gbc); 

      gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.insets = new Insets(2, 2, 2, 2); 
      gbc.gridheight = GridBagConstraints.REMAINDER; 
      gbc.weightx = 1; 
      gbc.weighty = 1; 
      gbc.fill = GridBagConstraints.BOTH; 
      add(fields, gbc); 
      gbc.gridx++; 
      add(new JScrollPane(area), gbc); 

     } 

    } 

} 

enter image description here

Maalesef bir noktada, her şey düzen ve işler sadece çöküşü ya ya kırpılmış görünür korumak için basitçe mümkün olmadığını bir noktaya ulaşacaktır.

Bu durumlarda, kapsayıcıyı JScrollPane içine yerleştirebilirsiniz, ancak bu durumda en kötü durum senaryosunu düşünebilirim.

+0

+1 metin alanına olan kısıtlamalara daha iyi ağırlık vermek için bir 'BorderLayout 'kullanın, metin alanını oluştururken sütunları belirtmekle ilgili iki noktayı ve minimum boyutu kullanarak GrigBagLayout öğesinde yer verdiniz. – camickr

+0

+1 GridBagLayout ve LayoutManager'ların mükemmel analizi. –