2009-07-13 12 views
10

Ho un JFrame con BorderLayout come gestore del layout.Rendere ridimensionabile manualmente un JPanel

Nel bordo sud, ho un JPanel, voglio che questa dimensione di JPanel sia regolabile dall'utente, cioè l'utente può fare clic sul bordo del bordo e trascinarlo verso l'alto per ingrandirlo.

C'è un modo per sapere che posso farlo?

risposta

19

Per rendere i pannelli in una cornice singolarmente ridimensionabili è necessario aggiungerli a JSplitPane.

Invece di posizionarlo nella parte Sud del Frame, inserire JSplitPane nel Center. Il pannello diviso farà apparire il pannello inferiore nella divisione come nel Sud, e il pannello superiore nella divisione sarà al centro del riquadro.

Assicurarsi di impostare l'orientamento dei due pannelli con setOrientation(JSplitPane.VERTICAL_SPLIT).

Quindi, è possibile ridimensionare i pannelli presenti nel riquadro.

11

Penso che intendevi dire JPanel. È possibile aggiungere un mouseListener personalizzato e gestire i clic del mouse, trascinare e rilasciare i mouse e quindi ridimensionare il pannello in modo programmatico.

Questo lo dimostrerà. Nota che jframe NON viene ridimensionato automaticamente con JPanel. Per rendere l'effetto più visibile ho dipinto il pannello rosso e ha aggiunto un bordo smussato:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.BevelBorder; 

@SuppressWarnings("serial") 
public class ResizablePanel extends JPanel { 

    private boolean drag = false; 
    private Point dragLocation = new Point(); 

    public ResizablePanel() { 
     setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); 
     setPreferredSize(new Dimension(500, 500)); 
     final JFrame f = new JFrame("Test"); 
     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       drag = true; 
       dragLocation = e.getPoint(); 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       drag = false; 
      } 
     }); 
     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       if (drag) { 
        if (dragLocation.getX()> getWidth()-10 && dragLocation.getY()>getHeight()-10) { 
         System.err.println("in"); 
         setSize((int)(getWidth()+(e.getPoint().getX()-dragLocation.getX())), 
           (int)(getHeight()+(e.getPoint().getY()-dragLocation.getY()))); 
         dragLocation = e.getPoint(); 
        } 
       } 
      } 
     }); 
     f.getContentPane().setLayout(new BorderLayout()); 
     f.getContentPane().add(this,BorderLayout.CENTER); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new ResizablePanel(); 
    } 

    public void paintComponent(Graphics g) { 
     g.setColor(Color.red); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
    } 

} 
+3

Questo è il modo sopra le righe! Un semplice 'JSplitPane' porterà a termine il lavoro. – jjnguy

+2

lo so. ho appena risposto alla sua domanda. –

+0

È comunque una soluzione interessante. – jjnguy

-4

potrebbe essere necessario specificare JFrame.setResizeable = true; sia della Capogruppo JFrame (quello con il layout a bordo) e il bambino JFrame.

Si potrebbe anche voler usare uno JPanel nel confine sud.

+2

Ha bisogno di ridimensionare il pannello, non la cornice – jjnguy

0

Ho fatto una lezione per questo se si vuole prendere uno look. Non è ancora finito.

package projetoSplitPainel; 

import java.awt.Component; 
import java.util.ArrayList; 

import javax.swing.JSplitPane; 

/** 
* This Components is based on the JSplitPane. JSplitPane is used to divide two 
* (and only two) Components. This class intend to manipulate the JSplitPane in 
* a way that can be placed as many Component as wanted. 
* 
* @author Bode 
* 
*/ 
public class JSplitPaneMultiTabs extends JSplitPane { 
    private ArrayList<JSplitPane> ecanpsulationList = new ArrayList<JSplitPane>(); 
    private int numberOfComponents = 1; 
    private int sizeOfDivision = 6; 

    /** 
    * Builds the Pane 
    */ 
    public JSplitPaneMultiTabs() { 
     super(); 
     this.setLeftComponent(null); 
     this.setBorder(null); 
     ecanpsulationList.add(this); 
     setAllBorders(sizeOfDivision); 
    } 

    /** 
    * 
    * @param comp - adds a Component to the Pane 
    */ 
    public void addComponent(Component comp) { 
     JSplitPane capsule = new JSplitPane(); 

     capsule.setRightComponent(null); 
     capsule.setLeftComponent(comp); 
     capsule.setDividerSize(sizeOfDivision); 
     capsule.setBorder(null); 

     ecanpsulationList.get(numberOfComponents - 1).setRightComponent(capsule); 
     ecanpsulationList.add(capsule); 
     numberOfComponents++; 
     this.fixWeights(); 
    } 

    /** 
    * 
    * @param orientation 
    *   JSplitPane.HORIZONTAL_SPLIT - sets the orientation of the 
    *   Components to horizontal alignment 
    * @param orientation 
    *   JSplitPane.VERTICAL_SPLIT - sets the orientation of the 
    *   Components to vertical alignment 
    */ 
    public void setAlignment(int orientation) { 
     for (int i = 0; i < numberOfComponents; i++) { 
      ecanpsulationList.get(i).setOrientation(orientation); 

     } 
    } 

    /** 
    * 
    * @param newSize - resizes the borders of the all the Components of the Screen 
    */ 
    public void setAllBorders(int newSize) { 
     this.setDividerSize(newSize); 
     for (int i = 0; i < numberOfComponents; i++) { 
      ecanpsulationList.get(i).setDividerSize(newSize); 
     } 

    } 

    /** 
    * each Component added needs to be readapteded to the screen 
    */ 
    private void fixWeights() { 
     ecanpsulationList.get(0).setResizeWeight(1.0); 
     for (int i = 1; i < numberOfComponents; i++) { 
      double resize = (double) 1/(double) (i + 1); 
      ecanpsulationList.get(numberOfComponents - i - 1).setResizeWeight(
        resize); 
     } 
     ecanpsulationList.get(numberOfComponents - 1).setResizeWeight(0.0); 
    } 

}