2013-02-19 3 views
8

Für meine Klasse CSE 205 (Java-Programmierung 2) müssen wir ein wirklich einfaches GUI-Applet entwerfen. Ich bin mit Swing ziemlich vertraut, habe es vorher für ein paar meiner eigenen Projekte benutzt. Ich habe das Programm mit wenigen Problemen entwickelt, und es sieht perfekt auf meinem Computer, wenn sie von Eclipse-laufen:Warum verliert meine Benutzeroberfläche die Formatierung, wenn sie im Browser ausgeführt wird oder auf meinem Computer ausgeführt wird (Java Swing)?

enter image description here

Aber als ich es online einreichen, wo es in Browser ausgeführt wird, wird die Benutzeroberfläche stark dementen, um die Standard Rückkehr zurück:

enter image description here

ich die GridBagLayout zu verwenden aufgrund seiner Einfachheit gewöhnt haben. Das ist es, was ich hier benutze. Die Klassen CreatePanel und SelectPanel (wie im ersten Bild zu sehen) erweitern beide JPanel (nach meinem Professor). Ich habe jede mit:

this.setLayout(new GridBagLayout()); 

Und und die Komponenten jeweils durch:

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

Wer irgendwelche Ideen von dem, was könnte da los? Wenn man bedenkt, dass über die Hälfte meiner Zeit damit verbracht wurde, die Layouts richtig aussehen zu lassen, würde ich mich über eine einfache Lösung freuen. Ich kann bei Bedarf mehr Code posten. Danke für Anregungen.

--EDIT--

Okay Ich habe ein bisschen spielen getan um basierend auf @ MadProgrammer Vorschläge. Ich glaube, ich habe mich irgendwie eingeengt, wo das Problem liegt.

Dies ist der Code, den ich die Größe des JTextField rechts von der Bezeichnung „Geben Sie einen Haustier-Typ festlegen bin mit:

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

Nun, wenn ich den Code auf etwas anderes zu ändern, wie die Einstellung, Anzahl der Spalten:

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

ich bekomme eine Benutzeroberfläche, die mit dem identisch aussieht, wenn ich es online etwas mit der Einstellung der Anzahl der Spalten zu tun, scheint es nach oben schrauben werden diese es hilft verengen für.. jemand?

+0

Viele Gründe. Ich könnte mir vorstellen, dass die Felder nicht mit Standardspalten (und Zeilen im Falle des Textbereichs) erstellt wurden. Könnte der Layout-Manager sein, der verwendet wurde, um den Bereich auf der Registerkarte zu platzieren ... – MadProgrammer

+0

Ich hatte Angst vor so etwas. Hast du irgendwelche Vorschläge, die ich vielleicht ausprobieren kann? – rphello101

+0

Es ist schwierig, mit einem Beispiel zu arbeiten, aber ... stellen Sie sicher, dass die Textkomponenten mit Spalten-/Zeilenwerten erstellt werden. Verwenden Sie ein 'BorderLayout', um die Komponente auf der Registerkarte zu platzieren und die Einschränkungen für den Textbereich – MadProgrammer

Antwort

9

Es gibt wirklich nicht genug Code, um das volle Ausmaß des Problems festzustellen, aber ein paar Ideen könnten helfen.

GridBagLayout wird versuchen wollen, und es ist Komponenten zu bekommen basierend auf ihren bevorzugten Größen wenn möglich. Wenn es nicht möglich ist, wird stattdessen die Mindestgröße angezeigt.

Stellen Sie sicher, dass Sie Ihre Textkomponenten mit Spalten (und im Fall des Textbereichs) Zeilen erstellen. Dies wird die bevorzugte Größe der Komponenten basierend auf einer Anzahl wichtiger Faktoren automatisch festlegen.

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

     } 

    } 

} 

Leider irgendwann wird alles einen Punkt erreichen, dass es einfach nicht möglich ist, entweder Zusammenbruch oder einfach abgeschnitten erscheinen werden das Layout und die Dinge zu halten.

In diesen Fällen könnten Sie den gesamten Container innerhalb einer JScrollPane platzieren, aber ich würde in diesem Fall ein Worst-Case-Szenario berücksichtigen.

+0

+1 besser zu gewichten, deckten Sie meine zwei Punkte über Spalten beim Erstellen des Textfelds und GrigBagLayout mit der Mindestgröße. – camickr

+0

+1 ausgezeichnete Analyse von GridBagLayout und LayoutManagers. –

Verwandte Themen