Χρησιμοποιώντας τον GridBagLayout manager

Κώδικας, πληροφορίες, ερωτήσεις και απαντήσεις σχετικές με την JavaScript.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
Dr_Java
Δημοσιεύσεις: 218
Εγγραφή: 15 Αύγ 2003 16:42
Τοποθεσία: πειραιας
Επικοινωνία:

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από Dr_Java » 09 Απρ 2005 19:25

Γενικά...
Έχω ακούσει αρκετές φορές για τον GridBagLayout manager της java οτι είναι ο ποιο δύσκολος manager που υπάρχει. ΝΑΙ είναι αλλά γιατί??? Μας παρέχει την δυνατότητα να τοποθετήσουμε τα components μας σε οποιοδήποτε σημείο θέλουμε πάνω σε ενα JFrame εαν τον setάρουμε σωστά. Ας πάρουμε παράδειγμα τους πίνακες στην HTML, θα μπορούσαμε να πούμε οτι είναι κάτι ανάλογο αυτών. Στην ουσία τι κάνει? Χωρίζει το frame μας σε grid (γραμμές και στήλες) και από εκεί και πέρα με κάποιες μεθόδους και σταθερές που αναφέρονται παρακάτω μας παρέχει access σε όλο τον περιβάλοντα χώρο.

Εικόνα

Setup...
Τώρα για να τον setάρουμε σωστά θα πρέπει :
1 Να Φτιάξουμε ένα object τύπου GridBagLayout. Δεν είναι ανάγκη να δώσουμε τίμες για το πόσες στήλες και γραμμές θα μπουν, αυτό είναι δουλειά του manager να το «μαντέψει» αργότερα όταν θα βάζουμε τα components.
2 Να του πούμε σε ποιό panel θα πάει να καθίσει.
3 Να φτιάξουμε ένα object τύπου GridBagConstrains. Αυτό είναι στην ουσία ο βοηθός του GridBagLayout και του λέει με ποιόν τρόπο θα τοποθετηθούν τα components στο grid.
4 Στο τέλος για κάθε component που φτιάχνουμε με τις σταθερές από το GridBagConstrains object να το κάνουμε add στον container μας.

Παράδειγμα:

Κώδικας: Επιλογή όλων

GridBagLayout  layout = new GridBagLayout();
mypanel.setLayout(layout);
GrigBagConstrains constrains = new GridBagConstrains();
constrains.weightx=100;
constrains.weighty=100;
constrains.gridx=0;
contrains.gridy=2;
constrains.gridwidth=2;
constrains.gridheight=1;
Μεταβλητές
Ας δούμε τώρα λίγο τις σταθερές που παίρνει το GridBagConstrains object:
To gridx και το gridy δηλώνουν την θέση των γραμμών και των στηλών
Το gridwidth και το gridheight δηλώνουν το πόσες γραμμές και στήλες θα καλήπτει το component μας
Το weightx και το weighty δηλώνουν το πόσο θα μεγαλώσει το πλάτος του κελιού.
Το fill δηλώνει την κατέυθηνση που θα καλήψει το component μας μέσα στο κελί σε περίπτωση που αλλάξουν οι διαστάσεις του παράθυρού μας σύμφωνα με τις σταθερές NONE,BOTH,ORIZONTAL,VERTICAL
Το anchor δηλώνει την θέσει που θα έχει το component μέσα στο κελί σύμφωνα με τις σταθερές CENTER,NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH,SOUTHWEST,WEST,NORTHWEST.
To ipadx και το ipady δηλώνουν το εσωτερικό κενό διάστημα που υπάρχει μεταξύ κελιού και component.
To inserts δηλώνει το κενό διάστημα μεταξύ των κελιών

Αυτές είναι οι βασικές σταθερές του GridBagConstraints. Εάν θέλετε «το κάτι παραπάνω» μπορείτε να το βρείτε στο documentation της java στη διεύθηνση: http://java.sun.com/developer/onlineTra ... dBagLayout

Στην πράξη...
Παρακάτω είναι ένα πρόγραμμα το οποίο δουλεύει με τον GridBagLayout manager. Η λειτουργία του είναι απλή, διαχειρίζεται ένα σταθερό κείμενο συμφώνα με κάποιες παραμέτρους που επιλέγει ο χρήστης.

Κώδικας: Επιλογή όλων

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

public class FontDialog
{
   public static void main(String[] args)
   {  
      FontDialogFrame frame = new FontDialogFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.show();
   }
}

class FontDialogFrame extends JFrame
{  
   public FontDialogFrame()
   {  
      setTitle("FontDialog");
      setSize(WIDTH, HEIGHT);

      Container contentPane = getContentPane();
      GridBagLayout layout = new GridBagLayout();
      contentPane.setLayout(layout);

      ActionListener listener = new FontAction();

      // Ta components
      
      JLabel faceLabel = new JLabel("Face: ");

      face = new JComboBox(new String[] 
         {  
            "Serif", "SansSerif", "Monospaced", 
            "Dialog", "DialogInput" 
         });
      
      face.addActionListener(listener);

      JLabel sizeLabel = new JLabel("Size: ");

      size = new JComboBox(new String[]
         {
            "8", "10", "12", "15", "18", "24", "36", "48"
         });

      size.addActionListener(listener);

      bold = new JCheckBox("Bold");
      bold.addActionListener(listener);

      italic = new JCheckBox("Italic");
      italic.addActionListener(listener);

      sample = new JTextArea();
      sample.setText(
         "The quick brown fox jumps over the lazy dog");
      sample.setEditable(false);
      sample.setLineWrap(true);
      sample.setBorder(BorderFactory.createEtchedBorder());

      // prosthiki twn component sto grid

      GridBagConstraints constraints = new GridBagConstraints();

      constraints.fill = GridBagConstraints.NONE;
      constraints.anchor = GridBagConstraints.EAST;
      constraints.weightx = 0;
      constraints.weighty = 0;

      add(faceLabel, constraints, 0, 0, 1, 1);
      add(sizeLabel, constraints, 0, 1, 1, 1);

      constraints.fill = GridBagConstraints.HORIZONTAL;
      constraints.weightx = 100;
      
      add(face, constraints, 1, 0, 1, 1);
      add(size, constraints, 1, 1, 1, 1);

      constraints.weighty = 100;
      constraints.fill = GridBagConstraints.NONE;
      constraints.anchor = GridBagConstraints.CENTER;

      add(bold, constraints, 0, 2, 2, 1);
      add(italic, constraints, 0, 3, 2, 1);

      constraints.fill = GridBagConstraints.BOTH;
      add(sample, constraints, 2, 0, 1, 4);
   }
  
   /**
      Mia methodos h opoia kanei add ta component sto grid 
      se siggekrimena kelia 
      @param c o component poy tha ginei add
      @param constraints o grid bag o opoios xrisimopoiite
      @param x h x grid thesi
      @param y h y grid thesi
      @param w to grid width
      @param h to grid height
   */
   public void add(Component c, GridBagConstraints constraints,
      int x, int y, int w, int h)
   {  
      constraints.gridx = x;
      constraints.gridy = y;
      constraints.gridwidth = w;
      constraints.gridheight = h;
      getContentPane().add(c, constraints);
   }

   public static final int WIDTH = 300;
   public static final int HEIGHT = 200;  

   private JComboBox face;
   private JComboBox size;
   private JCheckBox bold;
   private JCheckBox italic;
   private JTextArea sample;

   /**
      O listener o opoios diaxirizete tis 
      allages poy tha ginoyn sto keimeno mas
   */
   private class FontAction implements ActionListener
   {
      public void actionPerformed(ActionEvent event)
      {  
         String fontFace = (String)face.getSelectedItem();
         int fontStyle = (bold.isSelected() ? Font.BOLD : 0)
            + (italic.isSelected() ? Font.ITALIC : 0);
         int fontSize = Integer.parseInt(
            (String)size.getSelectedItem());
         Font font = new Font(fontFace, fontStyle, fontSize);
         sample.setFont(font);
         sample.repaint();
      }
   }
}
Και το αποτέλεσμα στη εικόνα παρακάτω

Εικόνα
Εικόνα

Άβαταρ μέλους
softius
Script Master
Δημοσιεύσεις: 241
Εγγραφή: 11 Ιαν 2004 19:07
Επικοινωνία:

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από softius » 09 Απρ 2005 20:27

Προσωπικά βρίσκω τον GridBagLayout manager αρκετά χρήσιμο. Δεν είναι καθόλου δύσκολος στην χρήση, ιδιαίτερα αν χρησιμοποιήσεις κάποιο GUI editor :kaloe: :kaloe: H αν φτιάξεις μία απλή μέθοδο - όπως έκανες κι εσύ - όποτε απλοποιούνται αρκετά πράγματα ;) Ορθή η παρομοίωση με τα tables στην HTML :wink:

Απλά μία μικρή διόρθωση: το weightx και το weighty παίρνουν τιμές από 0.0 μέχρι και 1.0. Το 0.0 σημαίνει ότι το component δεν θα πάρει καθόλου extra χώρο, πέραν από αυτό που χρειάζεται. Από την άλλη τοι 1.0 σημαίνει ότι το compoent θα πάρει όλο τον extra χώρο, εφ' όσον κανένα άλλο γειτονικό του component δεν έχει μη μηδενική τιμή. Αν για παράδειγμα δύο γειτονικά components έχουν weightx = 1.0, τότε θα μοιραστούν όλο τον ελεύθερο χώρο, στο οριζόντιο επίπεδο. Το αναφέρω γιατί είδα πως χρησιμοποιούσες την τιμή 100 για το weightx - δεν έχει καμία σχέση με το width τοu component :)

Άβαταρ μέλους
Dr_Java
Δημοσιεύσεις: 218
Εγγραφή: 15 Αύγ 2003 16:42
Τοποθεσία: πειραιας
Επικοινωνία:

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από Dr_Java » 09 Απρ 2005 20:47

:o :-?
Το αναφέρω γιατί είδα πως χρησιμοποιούσες την τιμή 100

που το κάνω αυτό μέσα στο πρόγραμμα?
Το άλλο είναι απλά ένα παράδειγμα, καλά έκανες και το διορθώσες. Με έστειλες, γιατί νόμιζα οτι το έκανα μεσα στο προγραμμα και λέω καλά πως έγινε compile...! :D
Εικόνα

Άβαταρ μέλους
softius
Script Master
Δημοσιεύσεις: 241
Εγγραφή: 11 Ιαν 2004 19:07
Επικοινωνία:

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από softius » 09 Απρ 2005 20:51

[...]
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.weightx = 100;

add(face, constraints, 1, 0, 1, 1);
add(size, constraints, 1, 1, 1, 1);
[...]

Άβαταρ μέλους
Dr_Java
Δημοσιεύσεις: 218
Εγγραφή: 15 Αύγ 2003 16:42
Τοποθεσία: πειραιας
Επικοινωνία:

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από Dr_Java » 09 Απρ 2005 20:54

Χρησιμοποιείς GUI editor?
Εικόνα

Άβαταρ μέλους
softius
Script Master
Δημοσιεύσεις: 241
Εγγραφή: 11 Ιαν 2004 19:07
Επικοινωνία:

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από softius » 09 Απρ 2005 21:07

Ότι βολεύει... πότε με το χέρι, πότε με GUI editor. Αυτό που με χαλά με τα GUI Editors είναι ότι από πίσω συχνά δημιουργείται ένα μεγάλος χάος :)

Άβαταρ μέλους
Dr_Java
Δημοσιεύσεις: 218
Εγγραφή: 15 Αύγ 2003 16:42
Τοποθεσία: πειραιας
Επικοινωνία:

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από Dr_Java » 09 Απρ 2005 21:17

Δεν τα μπορώ ρε γμτ αλλα αναγκαστηκά τα χρησιμοποιείς... για τον λόγο που είπες... ΧΑΟΣ
Εικόνα

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από skeftomilos » 10 Απρ 2005 16:19

Αν κατάλαβα καλά ο GridBagLayout manager είναι ένας τρόπος να τακτοποιήσεις το UI μίας Java windows εφαρμογής? Δε σας φαίνεται λίγο υπερβολική αυτή η μέθοδος? Εννοώ συγκρινόμενη με την HTML μέθοδο και τα <table>, ή ακόμα και τα <div> με CSS. Δε θα θέλατε να υπήρχε τρόπος να οριστεί το Windows UI με την ίδια ευκολία όπως το Web UI? Enter XAML!
:)
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
softius
Script Master
Δημοσιεύσεις: 241
Εγγραφή: 11 Ιαν 2004 19:07
Επικοινωνία:

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από softius » 10 Απρ 2005 19:31

Markup Languages υπάρχουν για όλων των ειδών τα interfaces, όπως για παράδειγμα η XUL για τις εφαρμογές Mozilla! Για την JAVA υπάρχουν οι SwingML και SwiXML.

Βέβαια θα διερωτάται κανείς γιατί να υπάρχουν οι layout managers στην java? Ουσιαστικά στόχος τους είναι να οργανώνουν το layout ανάλογα με το περιεχόμενο στο παράθυρο. Αξίζει να σημειωθεί πως κάθε manager συμπεριφέρεται διαφορετικά! Ποια η χρήση όμως;

Αν φτιάχνουμε μία multilanguage εφαρμογή, είναι γνωστό πως το κείμενο στη μετάφραση αλλάζει - το ίδιο και το μέγεθός του. Με τους layout manager, δεν έχουμε να ανησυχούμε γι αυτό, αφού το κάθε layout καθορίζεται στο runtime, ανάλογα με το περιεχόμενο και το μέγεθος. Για τον ίδιο λόγο, δεν υπάρχει λόγος ανησυχίας για το μέγεθος του παράθυρου, αφού κι εκείνο καθορίζεται αυτόματα.

Από την άλλη σε μερικές περιπτώσεις θέλουμε να κρατούμε ένα μέρος σταθερό π.χ. το αριστερό κομμάτι με τα labels ενώ το δεξιά να μεγαλώνει ανάλογα με το παράθυρο. Και πάλι αυτό συμβαίνει με τους manager.

Αυτά εν συντομία....

Άβαταρ μέλους
Dr_Java
Δημοσιεύσεις: 218
Εγγραφή: 15 Αύγ 2003 16:42
Τοποθεσία: πειραιας
Επικοινωνία:

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από Dr_Java » 11 Απρ 2005 14:10

Βασικά οταν φτιάχνετε κάποια εφαρμογή σε java ανάλογα με το που θέλει ο προγραμματιστής να τοποθετηθούν τα components επιλέγει και τον ανάλογο Manager. Για να γίνει η τοποθέτηση οποσδήποτε θα χρησιμοποιηθει κάποιος manager για αυτή την δουλειά. Υπάρχουν αρκετοί managers απλά ο καθένας έχει διαφορετικό τρόπο τοποθέτησης των αντικειμένων πάνω στο χώρο πχ άλλοι ταξινομούν οριζόντια άλλοι κάθετα κτλ... και το βασικότερο είναι οτι δεν υπάρχει άμεση επέμβαση από τον προγραμματιστή σε άλλους managers εκτώς του GridBagLayout. Πχ ο GridLayout manager χωρίζει μεν το χώρο σε κελιά αλλα δεν μπορεί να τοποθετήσει ένα component στη θέση πχ 2,1 που ορίζει ο προγραμματιστής.
Τώρα γιατί λέω οτι ο GridBagLayout μοιάζει με τους πίνακες στην HTML, γιατί πολύ απλά έχει όλες περίπου τις δυνατότητες που έχουν και οι πίνακες. Πχ μπορεί ο προγραμματιστής να ενώσει κελιά οριζόντια και κάθετα κτλ...
Εικόνα

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από skeftomilos » 11 Απρ 2005 15:33

Το συγκεκριμένο User Interface (UI) που ορίστηκε παραπάνω με τον GridBagLayout manager, θα μπορούσε να οριστεί με κάποια από τις SwingML και SwiXML? Οι markup γλώσσες είναι καταλληλότερες από τις imperative γλώσσες για τη δημιουργία των UIs. Η περιγραφή είναι διαισθητικότερη και πολύ λιγότερο μακροσκελής. Για παράδειγμα ο παρακάτω κώδικας VB.NET:

Κώδικας: Επιλογή όλων

Dim TextBox1 As New System.Windows.Forms.TextBox&#40;&#41;
TextBox1.Width = 100
TextBox1.Height = 22
TextBox1.Left = 10
TextBox1.Top = 40
TextBox1.ForeColor = System.Drawing.Color.DarkRed
... Θα γραφόταν κάπως έτσι σε XAML:

Κώδικας: Επιλογή όλων

<textbox width="100px" height="22px" left="10px" top="40px" forecolor="darkred" />
Βέβαια αυτός ο κώδικας τελικά θα μετατραπεί στον από πάνω, αλλά η μετατροπή θα γίνει αυτόματα από το tool και όχι από τον προγραμματιστή. Κι αν θέλουμε το TextBox να αλλάζει μέγεθος μαζί με τη φόρμα, γράφουμε απλά width="100%" αντί να παγιδεύσουμε το Resize event και να γράψουμε κώδικα TextBox1.Width = Blah1 + (Blah2 - Blah3)/Blah4.
:)
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
softius
Script Master
Δημοσιεύσεις: 241
Εγγραφή: 11 Ιαν 2004 19:07
Επικοινωνία:

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από softius » 11 Απρ 2005 15:44

skeftomilos έγραψε:Το συγκεκριμένο User Interface (UI) που ορίστηκε παραπάνω με τον GridBagLayout manager, θα μπορούσε να οριστεί με κάποια από τις SwingML και SwiXML?
Και βεβαίως :)

Άβαταρ μέλους
Dr_Java
Δημοσιεύσεις: 218
Εγγραφή: 15 Αύγ 2003 16:42
Τοποθεσία: πειραιας
Επικοινωνία:

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από Dr_Java » 12 Απρ 2005 03:36

Καλά εγω παραμένω στη java... :D Πιστεύω οτι δεν έχουν καμια σχέση οι ML languages με java οσον αφορά το κομμάτι του κώδικα.. Απλά είναι ποιό κατανοητές και ποιό εύχρηστες για το προγραμματιστή. :kaloe: :wink:
Εικόνα

Άβαταρ μέλους
softius
Script Master
Δημοσιεύσεις: 241
Εγγραφή: 11 Ιαν 2004 19:07
Επικοινωνία:

Χρησιμοποιώντας τον GridBagLayout manager

Δημοσίευση από softius » 12 Απρ 2005 11:39

Χρησιμοποιώντας *ML, διαχωρίζεις σε μεγάλο βαθμό την παρουσίαση από την λογική της εφαρμογής σου. Αν μαζί με αυτά χρησιμοποιήσεις και XML/XSLT τα πράγματα γίνονται ακόμη πιο απλά ;) Περιττό να αναφέρω ότι οι περισσότεροι gui editors για την java όπως αυτός του NetBeans, χρησιμοποιούν τέτοιες γλώσσες. Οι gui editors ωστόσο σου παρέχουν αυτόματα την μετάφραση σε java code. Οι γλώσσες που ανάφερα ποιο πάνω το παρέχουν αυτό κατά το runtime :D

Απάντηση

Επιστροφή στο “JavaScript και Frameworks”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες