Erstellen einer JPanel manuell veränderbare
-
12-09-2019 - |
Frage
Ich habe einen JFrame
mit BorderLayout
als Layout-Manager.
In der südlichen Grenze habe ich ein JPanel
, ich will dieses JPanel
Größe durch den Benutzer einstellbar sein, das heißt der Benutzer kann sich am Rande der Grenze klicken und ziehen Sie nach oben, um es größer zu machen.
Gibt es eine Möglichkeit Sie wissen, dass ich das tun kann?
Lösung
Um Platten in einem Rahmen zu machen, individuell veränderbare Sie sie auf eine JSplitPane
.
Stattdessen es im Süden Teil des Rahmens des Setzens, die JSplitPane
in den Mittelpunkt stellen. Die geteilte Scheibe wird die Bodenplatte im Split scheint, wie es im Süden, und die obere Platte im Split wird in der Mitte des Rahmens ist.
Stellen Sie sicher, dass Sie die Ausrichtung der beiden Platten mit setOrientation(JSplitPane.VERTICAL_SPLIT )
eingestellt.
Dann können Sie die Platten der Größe, das in der Scheibe ist.
Andere Tipps
Ich glaube, Sie JPanel sagen wollte. Sie können einen benutzerdefinierten mouselistener hinzufügen und Mausklicks, schleppt und Maus Mitteilungen behandeln und dann programmaticaly das Panel ändern.
Dies wird dies demonstrieren. Beachten Sie, dass die JFrame NICHT mit dem JPanel nicht automatisch die Größe neu. Um die Wirkung sichtbarer ich die Platte rot lackiert und hat eine abgeschrägte Rand:
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());
}
}
habe ich eine Klasse für dass, wenn Sie einen aussehen . Es isn `t fertig vor.
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);
}
}
Sie müssen möglicherweise JFrame.setResizeable = true;
auf sowohl die Eltern JFrame
(die mit der Grenze Layout) und das Kind JFrame
angeben.
Sie möchten auch vielleicht eine JPanel
in der südlichen Grenze verwenden.