سؤال

انا املك JFrame مع BorderLayout كمدير تخطيط.

في الحدود الجنوبية، لدي JPanel, ، اريد هذا JPanelالحجم لتكون قابلة للتعديل من قبل المستخدم، أي يمكن للمستخدم النقر فوق حافة الحدود واسحبه لجعله أكبر.

هل هناك أي طريقة تعرف أنه يمكنني القيام بذلك؟

هل كانت مفيدة؟

المحلول

من أجل صنع لوحات في إطار قابل للتغيير بشكل فردي، تحتاج إلى إضافتها إلى JSplitPane.

بدلا من وضعه في الجزء الجنوبي من الإطار، ضع JSplitPane في المركز. سيقوم جزء الانقسام يجعل اللوحة السفلية في الانقسام يبدو أنه في الجنوب، وستكون اللوحة العلوية في الانقسام في وسط الإطار.

تأكد من تعيين اتجاه اللوحتين setOrientation(JSplitPane.VERTICAL_SPLIT ).

ثم، يمكنك تغيير حجم الألواح الموجودة في الجزء.

نصائح أخرى

أعتقد أنك تهدف إلى قول جبانيل. يمكنك إضافة نقرات Mouselistener مخصصة ومقبض النقرات الماوس، والسحب والإصدارات الفورية ثم تغيير حجم Programmaticaly لوحة.

هذا سوف يثبت ذلك. لاحظ أن JFrame لا يتأرجح تلقائيا مع JPanel. لجعل التأثير أكثر وضوحا رسمت لوحة حمراء وأضفت الحدود المشطوفة:

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

}

أنا جعلت فئة لذلك إذا كنت تريد أن تأخذ نظرة. وبعد من غير ذلك بعد.

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

}

قد تضطر إلى تحديد JFrame.setResizeable = true; على كل من الوالد JFrame(واحد مع تخطيط الحدود) والطفل JFrame.

قد ترغب أيضا في استخدام JPanel في الحدود الجنوبية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top