java swing调整大小
我正在写一个库,在那里我被传递到一个容器中(通常是JPanel)java swing调整大小,swing,resize,Swing,Resize,我正在写一个库,在那里我被传递到一个容器中(通常是JPanel) 并为不同的控件、它们的位置、大小和其他属性提供xml规范。我必须在运行时创建这些控件并将其添加到组件中。处理父容器大小调整的好方法是什么 如果XML指定了绝对位置,则可能无法优雅地调整组件的大小。您可以创建一个自定义的LayoutManager来线性扩展它们,但这对于大多数组件来说可能是不好的 编辑:以下是一个可能有用的版本: public class LinearScaleLayout { public static v
并为不同的控件、它们的位置、大小和其他属性提供xml规范。我必须在运行时创建这些控件并将其添加到组件中。处理父容器大小调整的好方法是什么 如果XML指定了绝对位置,则可能无法优雅地调整组件的大小。您可以创建一个自定义的LayoutManager来线性扩展它们,但这对于大多数组件来说可能是不好的 编辑:以下是一个可能有用的版本:
public class LinearScaleLayout {
public static void main(String[] args) {
JFrame frame = new JFrame("Linear Scale Layout Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(100, 100, 200, 200);
JPanel scalePanel = new JPanel(new LinearScaleLayoutManager());
scalePanel.setBorder(new EmptyBorder(5, 5, 5, 5));
scalePanel.add(new JTextField(), new Rectangle2D.Double(0, 0, 1, 0.2));
scalePanel.add(new JScrollPane(new JEditorPane()), new Rectangle2D.Double(0, 0.25, 0.45, 0.75));
scalePanel.add(new JSlider(), new Rectangle2D.Double(0.55, 0.25, 0.45, 0.75));
frame.getContentPane().add(scalePanel);
frame.setVisible(true);
}
private static class LinearScaleLayoutManager implements LayoutManager2 {
private final HashMap<Component, Rectangle2D> rectMap = new HashMap<Component, Rectangle2D>();
@Override
public void layoutContainer(Container parent) {
synchronized (parent.getTreeLock()) {
Insets insets = parent.getInsets();
int clientWidth = parent.getWidth() - insets.left - insets.right;
int clientHeight = parent.getHeight() - insets.top - insets.bottom;
if (clientWidth > 0 && clientHeight > 0) {
for (Component component : parent.getComponents()) {
Rectangle2D rect = rectMap.get(component);
if (rect != null) {
component.setBounds(new Rectangle(insets.left + (int)(rect.getX() * clientWidth),
insets.top + (int)(rect.getY() * clientHeight), (int)(rect.getWidth() * clientWidth),
(int)(rect.getHeight() * clientHeight)));
}
}
}
}
}
@Override
public void addLayoutComponent(Component comp, Object constraints) {
rectMap.put(comp, (Rectangle2D)constraints);
}
@Override
public void removeLayoutComponent(Component comp) {
rectMap.remove(comp);
}
@Override
public Dimension minimumLayoutSize(Container parent) {
return new Dimension(0, 0);
}
@Override
public Dimension preferredLayoutSize(Container parent) {
return new Dimension(100, 100);
}
@Override
public Dimension maximumLayoutSize(Container target) {
return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
}
@Override
public void addLayoutComponent(String name, Component comp) {
}
@Override
public float getLayoutAlignmentX(Container target) {
return 0;
}
@Override
public float getLayoutAlignmentY(Container target) {
return 0;
}
@Override
public void invalidateLayout(Container target) {
}
}
}
公共类LinearScaleLayout{
公共静态void main(字符串[]args){
JFrame=新JFrame(“线性比例布局测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架.立根(100100200200);
JPanel scalePanel=newjpanel(newlinearscaleLayoutManager());
scalePanel.setBorder(新的空序(5,5,5,5));
添加(新的JTextField(),新的Rectangle2D.Double(0,0,1,0.2));
添加(新的JScrollPane(新的JEditorPane()),新的Rectangle2D.Double(0,0.25,0.45,0.75));
添加(新的JSlider(),新的Rectangle2D.Double(0.55,0.25,0.45,0.75));
frame.getContentPane().add(scalePanel);
frame.setVisible(true);
}
私有静态类LinearScaleLayoutManager实现LayoutManager2{
private final HashMap rectMap=new HashMap();
@凌驾
公共无效布局容器(容器父级){
已同步(父级.getTreeLock()){
Insets Insets=parent.getInsets();
int clientWidth=parent.getWidth()-insets.left-insets.right;
int clientHeight=parent.getHeight()-insets.top-insets.bottom;
if(clientWidth>0&&clientHeight>0){
对于(组件:parent.getComponents()){
Rectangle2D rect=rectMap.get(组件);
if(rect!=null){
setBounds(新矩形(insets.left+(int)(rect.getX()*clientWidth),
insets.top+(int)(rect.getY()*clientHeight),(int)(rect.getWidth()*clientWidth),
(int)(rect.getHeight()*clientHeight));
}
}
}
}
}
@凌驾
public void addLayoutComponent(组件组件、对象约束){
放置(comp,(Rectangle2D)约束);
}
@凌驾
公共void removeLayoutComponent(组件组件组件){
rectMap.remove(comp);
}
@凌驾
公共维度minimumLayoutSize(容器父级){
返回新维度(0,0);
}
@凌驾
公共维度preferredLayoutSize(容器父级){
返回新维度(100100);
}
@凌驾
公共维度maximumLayoutSize(容器目标){
返回新维度(Integer.MAX\u值、Integer.MAX\u值);
}
@凌驾
public void addLayoutComponent(字符串名称,组件组成){
}
@凌驾
公共浮点getLayoutAlignmentX(容器目标){
返回0;
}
@凌驾
公共浮点GetLayoutAlignment(容器目标){
返回0;
}
@凌驾
public void invalidateLayout(容器目标){
}
}
}