tab que jtab java swing jframe jpanel jsplitpane

java - que - Haciendo un JPanel manualmente redimensionable



scrollbar java swing (4)

Tengo un JFrame con BorderLayout como administrador de diseño.

En el borde sur, tengo un JPanel , quiero que el JPanel este JPanel sea ​​ajustable por el usuario, es decir, el usuario puede hacer clic en el borde del borde y arrastrarlo hacia arriba para agrandarlo.

¿Hay alguna manera de que sepas que puedo hacer esto?


Creo que quisiste decir JPanel. Puede agregar un mouseListener personalizado y manejar los clics del mouse, arrastra y libera el mouse y luego redimensionar el panel programáticamente.

Esto demostrará esto. Tenga en cuenta que el jframe NO cambia de tamaño automáticamente con el JPanel. Para hacer el efecto más visible, pinté el panel rojo y agregué un borde biselado:

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


Hice una clase para eso si quieres echar un vistazo . Todavía no está terminado.

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


Para poder cambiar el tamaño de los paneles en un marco, debe agregarlos a un JSplitPane .

En lugar de ponerlo en la parte sur del Marco, coloque el JSplitPane en el Centro. El panel dividido hará que el panel inferior en la división parezca estar en el sur, y el panel superior en la división estará en el centro del encuadre.

Asegúrese de establecer la orientación de los dos paneles con setOrientation(JSplitPane.VERTICAL_SPLIT ) .

Luego, puede cambiar el tamaño de los paneles que están en el panel.


Puede que tenga que especificar JFrame.setResizeable = true; en el JFrame (el que tiene el diseño de borde) y el JFrame secundario.

También es posible que desee utilizar un JPanel en el borde sur.