2013-02-19 13 views
8

Dla mojej klasy CSE 205 (Java programming 2) musimy zaprojektować prosty applet GUI. Jestem dość obeznany z Swingiem, wykorzystałem go wcześniej do kilku własnych projektów. Mam zaprojektowany program z kilkoma problemami, a to wygląda idealnie na moim komputerze po uruchomieniu z Eclipse:Dlaczego mój interfejs użytkownika traci formatowanie po uruchomieniu w przeglądarce lub uruchomieniu na moim komputerze (Java Swing)?

enter image description here

Ale kiedy mam złożyć go w Internecie, gdzie działa w przeglądarce, UI dostaje poważnie obłąkany, wracając z powrotem do ustawień:

enter image description here

ja przyzwyczaili się do korzystania z GridBagLayout ze względu na jego prostotę. Właśnie tego tutaj używam. Klasy CreatePanel i SelectPanel (jak widać na pierwszym obrazku) obaj rozszerzają JPanel (jak na mojego profesora). Ustawić każdy przy użyciu:

this.setLayout(new GridBagLayout()); 

I i elementy do siebie przez:

//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); 
     } 

Ktoś ma jakieś pomysły co może być grane? Biorąc pod uwagę, że ponad połowa czasu spędziłem na poprawianiu wyglądu układów, bardzo chciałbym prostą poprawkę. W razie potrzeby mogę dodać więcej kodu. Dzięki za wszelkie sugestie.

--EDIT--

Dobrze zrobiłem trochę zabawy oparte na użytkownika @ MadProgrammer sugestie. Myślę, że w pewnym sensie zawęziłem problem.

Jest to kod używam ustawić rozmiar JTextField na prawo od etykiety „Enter a Pet Typ:

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

Teraz, jeśli mogę zmienić kod do niczego innego, jak ustawienie liczba kolumn:

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

dostaję UI że wygląda identycznie jak ten, kiedy złożyć go w Internecie coś wspólnego z ustawieniem liczba kolumn wydaje się być przykręcenie go Czy to pomoże sprowadzić do.. ktoś?

+0

Wiele powodów. Wyobrażam sobie, że te pola nie zostały utworzone z domyślnymi kolumnami (i wierszami w przypadku obszaru tekstowego). Może być menedżerem układu, który został użyty do umieszczenia panelu na karcie ... – MadProgrammer

+0

Bałem się czegoś takiego. Czy masz jakieś sugestie, które mógłbym spróbować? – rphello101

+0

Trudno jest na przykładzie pracować, ale ... upewnij się, że komponenty tekstowe są tworzone z wartościami kolumny/wiersza. Użyj elementu 'BorderLayout', aby umieścić komponent na karcie i nadaj większą wagę ograniczeniom do obszaru tekstowego – MadProgrammer

Odpowiedz

9

Nie ma wystarczającej ilości kodu, aby ustalić cały problem, ale kilka pomysłów może pomóc.

GridBagLayout będzie chciał wypróbować komponenty do rozmieszczenia w oparciu o preferowane rozmiary, jeśli to możliwe. Jeśli nie, zamiast tego będzie szukał minimalnego rozmiaru.

Upewnij się, że komponenty tekstowe są tworzone z kolumnami (oraz w przypadku wiersza tekstu). Utworzy to preferowaną wielkość komponentów automatycznie w oparciu o szereg ważnych czynników.

enter image description here

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

     } 

    } 

} 

Niestety, w pewnym momencie, wszystko dotrze do punktu, że nie jest po prostu możliwe, aby utrzymać układ i rzeczy albo zapaść lub po prostu wyglądają obcięte.

W takich przypadkach można umieścić cały pojemnik w ramach JScrollPane, ale uważam, że w tym przypadku najgorszy scenariusz.

+0

+1, omówiono moje dwa punkty dotyczące określania kolumn podczas tworzenia pola tekstowego i GrigBagLayout przy użyciu minimalnego rozmiaru. – camickr

+0

+1 doskonała analiza GridBagLayout i LayoutManagers. –

Powiązane problemy