2012-04-08 15 views
3

Ich habe zwei Probleme mit dem Layout meiner GUI. Ich verwende ein JTabbedPane, um zwei JPanels zu halten, jedes Panel hat eine Auswahl an Buttons und Textbereichen, und jeder ist mit GridBagLayout ausgelegt. In einem meiner Panels habe ich einen JScrollPane, der eine JTextArea verwendet. Wenn ich irgendetwas an diesen Textbereich angehängt habe und dann auf die GUI klicke, so dass es keinen Fokus mehr hat, oder wenn ich die Registerkarte ändere, werden die Größen aller Textfelder und der Text so klein wie möglich geändert.Swing-Komponenten, die ihre Größe ändern, wenn sie sich nicht im Fokus der Tastatur befinden

weiter, um mein Problem zu illustrieren, hier sind vor und nach Bilder von, wenn ich die gui nach Anhängen an den Textbereich klicken off: Before I click off the gui

After I click off the gui

Hier ist der Code, den ich hinzufügen die JTextArea zum Panel:

table = new JTextArea(); 
    table.setEditable(false); 
    JScrollPane sp = new JScrollPane(table); 
    sp.setSize(40, 10); 
    c.insets = new Insets(10,10,10,10); 
    c.gridx = 1; 
    c.gridwidth = 4; 
    c.gridy = 7; 
    c.gridheight = 7; 
    this.add(sp, c); 

Und hier ist der Code, den ich verwende, um die Textbereiche zum Panel hinzuzufügen:

title = new JTextField(10); 
    author = new JTextField(10); 
    dueDate = new JTextField(10); 
    setDate = new JTextField(10); 
    setWeighting = new JTextField(10); 

    c.gridx = 2; 
    c.gridy = 1; 
    this.add(title, c);//add title field 
    c.gridx = 2; 
    c.gridy = 2; 
    this.add(author, c);//add author field 
    c.gridx = 2; 
    c.gridy = 3; 
    this.add(dueDate, c);//add dueDate field 
    c.gridx = 2; 
    c.gridy = 4; 
    this.add(setDate, c);//add setDate field 
    c.gridx = 2; 
    c.gridy = 5; 
    this.add(setWeighting, c);//add set Weighting field 
+0

Es wäre hilfreich, einen kompilierbaren und ausführbaren Code zu sehen. Nicht das ganze Programm, aber gerade genug, um das Problem zu reproduzieren, ohne so groß zu sein, um uns mit viel unzusammenhängendem Code zu überschwemmen. –

+1

Ich sehe nirgendwo, wo Sie die Gewicht x oder gewichtigen Felder der GridBagComponents festlegen. Was passiert, wenn Sie sie auf 1.0 setzen? Wenn dies nicht hilft, erwägen Sie erneut, ein kompilierbares ausführbares kleines Programm zu veröffentlichen, das das Problem demonstriert, ein [SSCCE] (http://sscce.org). –

+0

Es scheint nichts zu ändern, wenn ich das tue, das Größenänderungsverhalten tritt immer noch auf. – lilroo

Antwort

3

ich in der Lage war zum Teil das Problem zu reproduzieren, wie so:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Foo002 { 

    private static final int ROWS = 5; 

    private static void createAndShowGui() { 
     JPanel assignmentsPanel = new JPanel(new GridBagLayout()); 
     final JTextArea textarea = new JTextArea(ROWS, 20); 

     GridBagConstraints c = new GridBagConstraints(); 
     int insetGap = 2; 
     c.insets = new Insets(insetGap, insetGap, insetGap, insetGap); 
     c.fill = GridBagConstraints.HORIZONTAL; 
     c.gridwidth = 1; 
     c.gridheight = 1; 
     c.weightx = 1.0; 
     c.weighty = 1.0; 
     String[] labels = { "title", "author", "date due", "date set", 
      "set weighting" }; 
     int row = 0; 
     for (int i = 0; i < labels.length; i++) { 
     JLabel label = new JLabel(labels[i], SwingConstants.CENTER); 
     c.gridx = 0; 
     c.gridy = i; 
     assignmentsPanel.add(label, c); 
     c.gridx = 1; 
     JTextField textfield = new JTextField(10); 
     assignmentsPanel.add(textfield, c); 

     label.setPreferredSize(textfield.getPreferredSize()); 
     row++; 
     } 
     c.gridx = 0; 
     c.gridy = row; 
     c.fill = GridBagConstraints.HORIZONTAL; 
     Action myAction = new AbstractAction("Fill Area") { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      StringBuilder sb = new StringBuilder(); 
      for (int i = 0; i < 10; i++) { 
       sb.append("foo bar bif baz spam\n"); 
      } 
      textarea.setText(sb.toString()); 
     } 
     }; 
     assignmentsPanel.add(new JButton(myAction), c); 
     c.gridx = 1; 
     assignmentsPanel.add(new JButton("Button 2"), c); 
     row++; 

     c.gridx = 0; 
     c.gridy = row; 
     c.gridwidth = 2; 
     c.gridheight = ROWS; 

     JScrollPane scrollpane = new JScrollPane(textarea); 

     assignmentsPanel.add(scrollpane, c); 

     JTabbedPane tabbedPanel = new JTabbedPane(); 
     tabbedPanel.add("Assignments", assignmentsPanel); 
     tabbedPanel.add("Modules", new JPanel()); 

     JOptionPane.showMessageDialog(null, tabbedPanel, "Foo", 
      JOptionPane.PLAIN_MESSAGE); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

Vor und nach dem Text zu JTextArea hinzufügen, sieht es so aus:
enter image description hereenter image description here

Und nach auf Registerkarten klicken:

Aber es kann mit dem JScrollPan behoben werden ea vertikale Scrollbalken:

// JScrollPane scrollpane = new JScrollPane(textarea); 
    JScrollPane scrollpane = new JScrollPane(textarea, 
     JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
     JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

die, wenn sie laufen wie folgt aussieht:
enter image description here

sieht gut aus auf Mac OS auch:

enter image description here

+0

Ich habe es gerade versucht und das Problem tritt immer noch auf:/danke aber :) – lilroo

+4

@lilroo: dann beweisen Sie es, indem Sie ein [sscce] (http://sscce.org) ähnlich dem, was ich gerade oben gepostet habe, posten. Dadurch können wir genau sehen, was Ihr Problem ist. –

1

Sie können versuchen, aus der Stimme zu enthalten GridBag mit und Verwenden Sie stattdessen geschachtelte JPanels. Ich habe mir die Freiheit genommen, ein kurzes Beispiel zu erstellen:

public class LilrooPanel extends JPanel 
{ 
    private static final int GAP = 5; 

    public static void main(String[] args){ 
     JFrame main = new JFrame("Dims"); 
     JTabbedPane tabbed = new JTabbedPane(); 
     JPanel myPanel = new LilrooPanel(); 
     tabbed.add("Assignments", myPanel); 
     tabbed.add("Modules", new JPanel()); 
     main.setContentPane(tabbed); 
     main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     main.setSize(400, 400); 
     main.setLocationRelativeTo(null); 
     main.setVisible(true); 
    } 

    public LilrooPanel(){ 
     super(new BorderLayout(0, GAP)); 
     setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP)); 
     Box north = new Box(BoxLayout.Y_AXIS); 

     north.add(new BorderPanel("Assignment Title", new JTextField())); 
     north.add(Box.createRigidArea(new Dimension(0, GAP))); 
     north.add(new BorderPanel("Author", new JTextField())); 
     north.add(Box.createRigidArea(new Dimension(0, GAP))); 
     north.add(new BorderPanel("Date Due", new JTextField())); 
     north.add(Box.createRigidArea(new Dimension(0, GAP))); 
     north.add(new BorderPanel("Date Set", new JTextField())); 
     north.add(Box.createRigidArea(new Dimension(0, GAP))); 
     north.add(new BorderPanel("Set Weighting", new JTextField())); 
     north.add(Box.createRigidArea(new Dimension(0, GAP))); 

     JPanel buttonsPanel = new JPanel(); 
     buttonsPanel.add(new JButton("Add Assignment")); 
     buttonsPanel.add(new JButton("Remove Assignment")); 
     north.add(buttonsPanel); 

     add(north, BorderLayout.NORTH); 

     add(new JScrollPane(new JTable(new Object[][]{}, new Object[]{"ModTitle", "ModId", "Assignments"}))); 
    } 

    private static class BorderPanel extends JPanel 
    { 
     private static final Dimension LABELS_WIDTH = new Dimension(100, 0); 

     public BorderPanel(String label, JComponent right){ 
      super(new BorderLayout(GAP, 0)); 
      JLabel jLabel = new JLabel(label); 
      jLabel.setPreferredSize(LABELS_WIDTH); 
      add(jLabel, BorderLayout.WEST); 
      add(right); 
     } 
    } 
} 
Verwandte Themen