2009-07-13 19 views
10

Mam JFrame z BorderLayout jako menedżera układu.Ręczne zmienianie rozmiaru pliku JPanel

Na południowej granicy mam JPanel, chcę, aby ten rozmiar JPanel był regulowany przez użytkownika, tj. Użytkownik może kliknąć krawędź granicy i przeciągnąć ją w górę, aby była większa.

Czy jest jakiś sposób, aby wiedzieć, że mogę to zrobić?

Odpowiedz

19

Aby indywidualnie dopasować panele w ramce, należy dodać je do numeru JSplitPane.

Zamiast umieszczać go w południowej części ramy, umieść ikonę JSplitPane w środku. Podzielone okno spowoduje, że dolny panel w podziale będzie wyglądał tak, jakby znajdował się na południu, a górny panel podziału będzie znajdować się w środku kadru.

Upewnij się, że ustawiłeś orientację dwóch paneli za pomocą setOrientation(JSplitPane.VERTICAL_SPLIT).

Następnie można zmienić rozmiar paneli znajdujących się w okienku.

11

Chyba miałeś zamiar powiedzieć JPanel. Możesz dodać niestandardowy mouseListener i obsługiwać kliknięcia myszą, przeciągnięcia i wydania myszy, a następnie programowo zmienić rozmiar panelu.

To zademonstruje to. Zauważ, że jframe NIE zmienia się automatycznie z JPanel. Aby efekt bardziej widoczny i malowany panel czerwony i dodał skośną granicę:

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

To jest droga ponad szczytem! Prosta 'JSplitPane' wykona zadanie. – jjnguy

+2

Wiem. właśnie odpowiedziałem na jego pytanie. –

+0

Jest to jednak interesujące rozwiązanie. – jjnguy

-4

może być określenie JFrame.setResizeable = true; zarówno Dominującej JFrame (jednego z układem granicznym) i dziecka JFrame.

Możesz również użyć JPanel w południowej granicy.

+2

Musi zmienić rozmiar panelu, a nie ramki – jjnguy

0

Zrobiłem zajęcia dla tego, jeśli chcesz wziąć look. To jeszcze nie koniec.

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

} 
Powiązane problemy