2016-10-03 4 views
1

Je souhaite créer une certaine méthode qui peut m'aider à accélérer la conception graphique. Je prends le plus longtemps en utilisant setBounds. Maintenant, je voudrais juste aller pour FlowLayout ou GridLayout, mais je n'aime pas être dépendante de ceux-ci.Comment modifier la méthode setBounds pour JComponents?

Fondamentalement, je pense à une méthode comme placeAbove, qui place un JComponent au-dessus d'un autre composant JComponent. Ses arguments seraient le point de référence JComponent et un entier pour leur distance les uns par rapport aux autres. Je suis actuellement le succès avec ce qui suit:

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

public class BoundBender extends JFrame { 
    public BoundBender() { 
     Container c = getContentPane(); 
     c.setLayout(null); 

     JLabel l1 = new JLabel("Reference Point"); 
     JLabel l2 = new JLabel("Above Label"); 
     JLabel l3 = new JLabel("Below Label"); 
     JLabel l4 = new JLabel("Before Label"); 
     JLabel l5 = new JLabel("After Label"); 

     c.add(l1); 
     l1.setBounds(170, 170, 100, 20); 
     c.add(l2); 
     placeAbove(l1, 0, l2); 
     c.add(l3); 
     placeBelow(l1, 10, l3); 
     c.add(l4); 
     placeBefore(l1, 20, l4); 
     c.add(l5); 
     placeAfter(l1, 30, l5); 

     setVisible(true); 
     setSize(500, 500); 
    } 
    public static void main (String args[]) { 
     BoundBender bb = new BoundBender(); 
     bb.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
    public static void placeAbove(JComponent j, int a, JComponent k) { 
     int x= j.getX(); 
     int y= j.getY(); 
     int w= j.getWidth(); 
     int h= j.getHeight(); 

     y=(y-h)-a; 

     k.setBounds(x, y, w, h); 
    } 
    public static void placeBelow(JComponent j, int a, JComponent k) { 
     int x= j.getX(); 
     int y= j.getY(); 
     int w= j.getWidth(); 
     int h= j.getHeight(); 

     y=y+h+a; 

     k.setBounds(x, y, w, h); 
    } 
    public static void placeBefore(JComponent j, int a, JComponent k) { 
     int x= j.getX(); 
     int y= j.getY(); 
     int w= j.getWidth(); 
     int h= j.getHeight(); 

     x=(x-w)-a; 

     k.setBounds(x, y, w, h); 
    } 
    public static void placeAfter(JComponent j, int a, JComponent k) { 
     int x= j.getX(); 
     int y= j.getY(); 
     int w= j.getWidth(); 
     int h= j.getHeight(); 

     x=x+w+a; 

     k.setBounds(x, y, w, h); 
    } 
} 

Cependant, je veux qu'il soit aussi simple que l2.placeAbove(l1, 0), parce que ce troisième argument semble inefficace. Donc, des suggestions? Et s'il vous plaît utiliser des terminologies compréhensibles.

+0

Java Swing a été conçu pour être utilisé avec [layout managers] (https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html). Jetez un coup d'œil au [Spring layout manager] (https://docs.oracle.com/javase/tutorial/uiswing/layout/spring.html), et voyez si vous préférez l'utiliser. –

Répondre

0

Ensuite, utilisez la valeur de retour de celui-ci. Au lieu d'être void renvoyer une instance de Rectangle. Il ressemblerait à quelque chose comme:

public static Rectangle placeAbove(JComponent j, int a) { 
    int x= j.getX(); 
    int y= j.getY(); 
    int w= j.getWidth(); 
    int h= j.getHeight(); 

    y=(y-h)-a; 

    //return our new bounds projected in a Rectangle Object 
    return new Rectangle(x, y, w, h); 
} 

Et puis le cas d'utilisation serait établirons le rectangle en bordure:

k.setBounds(placeAbove(j, a)); 

De cette façon, vous utilisez la setBounds(Rectangle r) héritée de java.awt.Component en JComponent.

Espérons que cela aide!

+1

J'aurais aimé ne plus utiliser setBounds ... Merci beaucoup parce que cela m'a aidé à mieux comprendre la classe Rectangle. :) – ArcIX