Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing MigLayout无法增加填充列以填充容器长度_Java_Swing_Miglayout - Fatal编程技术网

Java Swing MigLayout无法增加填充列以填充容器长度

Java Swing MigLayout无法增加填充列以填充容器长度,java,swing,miglayout,Java,Swing,Miglayout,我正在使用MigLayout来显示一个很长的窗口 我想“推”第二列和第四列,填满整个窗口,但我无法实现。列约束中没有push选项,只有grow和fill 这是一个SCCEE,正如有人曾经建议的,我已经忘记了他的名字: package com.WindThunderStudio.MigLayoutTest; import java.awt.Cursor; import java.awt.EventQueue; import javax.swing.JFrame; import javax.s

我正在使用
MigLayout
来显示一个很长的窗口

我想“推”第二列和第四列,填满整个窗口,但我无法实现。列约束中没有
push
选项,只有
grow
fill

这是一个SCCEE,正如有人曾经建议的,我已经忘记了他的名字:

package com.WindThunderStudio.MigLayoutTest;

import java.awt.Cursor;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class MigLayoutTest extends JFrame{
private JFrame mainFrame;
private JPanel panel;

private JLabel lblResumenAuto;
private JLabel lblResumenAutoResult;
private JLabel lblResumenRazonSocial;
private JLabel lblResumenRazonSocialResult;
private JLabel lblResumenPeriodo;
private JLabel lblResumenPeriodoResult;
private JLabel lblResumenFechaHora;
private JLabel lblResumenFechaHoraResult;

public MigLayoutTest(){
    run();
}

public void run(){
    mainFrame = new JFrame();
    mainFrame.setBounds(0, 0, 1250, 500);
    mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    JPanel p = new JPanel();
    p.setSize(mainFrame.getSize());

    p.setLayout(new MigLayout("fill","[max!, grow]","[50:20:30]10[100::]10[20::]10[50!]10[20!]"));
    mainFrame.setContentPane(p);

    panel = new JPanel();
    panel.setLayout(new MigLayout("fillx", "[left, 15%]10[left, grow, 35%]10[left, 15%]10[left, grow, 35%]", "[center]10[center]"));

    lblResumenAuto = new JLabel("MY LABEL 1111111111111");
    lblResumenAutoResult = new JLabel("1111111111111111111111");

    panel.add(lblResumenAuto);
    panel.add(lblResumenAutoResult);

    lblResumenRazonSocial = new JLabel("MY LABEL 2222222222");
    lblResumenRazonSocialResult = new JLabel("2222222222222222222222");

    panel.add(lblResumenRazonSocial);
    panel.add(lblResumenRazonSocialResult,"wrap");

    lblResumenPeriodo = new JLabel("MY LABEL 33333333333333");
    lblResumenPeriodoResult = new JLabel("3333333333333333333333333333333333333333333333333333333");

    panel.add(lblResumenPeriodo);
    panel.add(lblResumenPeriodoResult);
    //poner el texto como html puede tener otra linea, porque es muy largo
    lblResumenFechaHora = new JLabel("<html>MY LABEL <br /> 4444444444444444</html>");
    lblResumenFechaHoraResult = new JLabel("4444444444444444444444444");

    panel.add(lblResumenFechaHora);
    panel.add(lblResumenFechaHoraResult);

    p.add(panel,"cell 0 0");

    getContentPane().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    setBounds(0, 0, 1250, 500);
    getContentPane().add(mainFrame.getContentPane());

    pack();
    setVisible(true);
    setLocationRelativeTo(null);
    setResizable(true);
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            MigLayoutTest test = new MigLayoutTest();

        }
    });
}
}

但是,如果我设置
pref:min:max
,它可以填充整个宽度。

首先是代码,然后是解释。试试这个:

import java.awt.Cursor;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class MigLayoutTest extends JFrame {
  private JPanel panel;

  private JLabel lblResumenAuto;
  private JLabel lblResumenAutoResult;
  private JLabel lblResumenRazonSocial;
  private JLabel lblResumenRazonSocialResult;
  private JLabel lblResumenPeriodo;
  private JLabel lblResumenPeriodoResult;
  private JLabel lblResumenFechaHora;
  private JLabel lblResumenFechaHoraResult;

  public MigLayoutTest() {
    run();
  }

  public void run() {
    panel = new JPanel();
    panel.setLayout(new MigLayout("debug, fill",
        "[left, 15%]10[left, 35%]10[left, 15%]10[left, 35%]", "[center]10[center]"));

    lblResumenAuto = new JLabel("MY LABEL 1111111111111");
    lblResumenAutoResult = new JLabel("1111111111111111111111");

    panel.add(lblResumenAuto, "sg label");
    panel.add(lblResumenAutoResult, "sg value");

    lblResumenRazonSocial = new JLabel("MY LABEL 2222222222");
    lblResumenRazonSocialResult = new JLabel("2222222222222222222222");

    panel.add(lblResumenRazonSocial, "sg label");
    panel.add(lblResumenRazonSocialResult, "sg value, wrap");

    lblResumenPeriodo = new JLabel("MY LABEL 33333333333333");
    lblResumenPeriodoResult = new JLabel("3333333333333333333333333333333333333333333333333333333");

    panel.add(lblResumenPeriodo, "sg label");
    panel.add(lblResumenPeriodoResult, "sg value");
    // poner el texto como html puede tener otra linea, porque es muy largo
    lblResumenFechaHora = new JLabel("<html>MY LABEL <br /> 4444444444444444</html>");
    lblResumenFechaHoraResult = new JLabel("4444444444444444444444444");

    panel.add(lblResumenFechaHora, "sg label");
    panel.add(lblResumenFechaHoraResult, "sg value");

    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    getContentPane().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    getContentPane().add(panel);

    pack();
    setVisible(true);
    setLocationRelativeTo(null);
    setResizable(true);
  }

  public static void main(String[] args) {
    MigLayoutTest test = new MigLayoutTest();
  }

}
您将
面板
放在
p
的左上角单元格中-这就是为什么
面板
没有分布在整个窗口中,而是位于左上角的原因

正如你所看到的,没有<代码> p>代码>它在屏幕的中间位置很好,没有任何固定的大小,仍然显示所有的组件,但更重要的是,它的窗口大小的50%为最后两列的第一个和50%个窗口。这是通过给组件一个“sizegroup”来实现的:

为元件提供尺寸组名称。共享一个组件的所有组件 大小组名称将获得相同的边界大小(最小/首选/最大)。它是 用于确保相同大小组中的所有组件都获得 相同的最小/首选/最大尺寸,即 小组。可以使用空名称“”

而且它还可以调整大小

嵌套布局也可能是另一个问题的根源–不知道您是否没有注意到它,或者它只是没有显示在您的计算机上,但是如果我尝试调整您的窗口大小,
面板
会越来越宽(从未变窄),即使我缩小了窗口。在某些点上,它变得比窗口本身更宽,甚至在每次调整大小时都会进一步增大

下一步-将尺寸设置为常量没有意义,因为在
pack
之后,布局管理器开始根据窗口及其内容的首选尺寸调整所有内容的大小。此外,您永远不知道用户屏幕的大小,因此,如果有效地使用,任何恒定的大小都可能同样糟糕。最好通过内容和可用的运行时环境来驱动大小。在我的机器上,你的代码占用了我两个屏幕(2 x 1280)所有可用的水平空间,看起来并不漂亮

我还认为您不需要使用
EventQueue.invokeLater
启动框架,只需创建一个
MigLayoutTest
,就可以了

在OP自己的答案后编辑

pack
之前使用
setBounds(0,0,1250,500)
设置大小是不正确的(我的意思是将窗口设置为该大小)。即使在OP自己回答下面的屏幕截图中,它也不是500px高。以下是我在运行JDK 1.8.091的Windows 7上得到的信息:

我的屏幕大小是1280 x 1024,程序窗口的大小是914 x 301

我建议使用以下方法之一:

要将其设置为1250 x 500 px的恒定大小,请在
pack
setVisible
之间移动
setSize

...
pack();
setSize(1250, 500);
我会使用
setSize
setBounds
没有意义,因为调用
setLocationRelativeTo(null)
无论如何都会使程序窗口在屏幕上居中,因此原点会立即被取消

要水平最大化并使高度为500 px,请在打包前设置主窗口的首选尺寸:

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setPreferredSize(new Dimension(screenSize.width, 500));
水平最大化,并使首选高度保持原样:

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setPreferredSize(new Dimension(screenSize.width, getPreferredSize().height));
当然,您可以通过设置窗口的首选大小,而不是使用
setSize
,使窗口1250 x 500变大

调整大小的问题现在并没有那么大,但它仍然存在——使窗口变宽,而不是缩小一点。您会注意到,即使窗口变窄,
面板
也会变宽。问题是
panel
组件最初不够大,无法填充
p
的一列(顺便说一句,您可以将'debug'标志添加到每个MigLayout,以及
panel
的标志,然后它也将概述所有内部组件)

要使其填充父容器,请按如下方式添加:

p.add(panel, "cell 0 0, grow");
现在是
p
的全宽,从一开始就调整大小,正如预期的那样

关于使用
invokeLater
启动
JFrame
——我们启动主窗口时通常没有它,而且从来没有遇到过问题,因为在第一个框架出现之前,Swing没有交互,但我刚刚注意到,它被认为是最佳实践——即使在Oracle的教程中也是如此。看起来我在这里也学到了一些东西:-)

添加和不添加“grow”时框架窗口的比较

测试场景:启动应用程序并调整其大小以使其更宽


正如您在第一个屏幕截图中看到的,组件大小小于列宽-在调整大小时,组件似乎位于列宽后面。在第二个屏幕截图上,组件宽度始终保持与列宽相同。正如我之前所说,原因可能是Java和/或操作系统的组合,我不知道。但很明显,它的行为不同,在我的机器上没有达到最佳状态。

多亏了@Tomasz Stanczak,我终于解决了这个问题。然而,我发现他所说的部分内容是相关的,而其他部分则不是。对于未来可能看到这一点的读者,我必须把它说得更清楚

最终工作代码为:

import java.awt.Cursor;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class MigLayoutMySCCEE extends JFrame{
private JFrame mainFrame;
private JPanel panel;

private JLabel lblResumenAuto;
private JLabel lblResumenAutoResult;
private JLabel lblResumenRazonSocial;
private JLabel lblResumenRazonSocialResult;
private JLabel lblResumenPeriodo;
private JLabel lblResumenPeriodoResult;
private JLabel lblResumenFechaHora;
private JLabel lblResumenFechaHoraResult;

public MigLayoutMySCCEE(){
    run();
}

public void run(){
    JPanel p = new JPanel();
    p.setLayout(new MigLayout("debug, fill","[grow]","[50:20:30]10[100::]10[20::]10[50!]10[20!]"));

    panel = new JPanel();
    panel.setLayout(new MigLayout("fillx", "[left, 15%]10[left, grow, 35%]10[left, 15%]10[left, grow, 35%]", "[center]10[center]"));

    lblResumenAuto = new JLabel("MY LABEL 1111111111111");
    lblResumenAutoResult = new JLabel("1111111111111111111111");

    panel.add(lblResumenAuto);
    panel.add(lblResumenAutoResult);

    lblResumenRazonSocial = new JLabel("MY LABEL 2222222222");
    lblResumenRazonSocialResult = new JLabel("2222222222222222222222");

    panel.add(lblResumenRazonSocial);
    panel.add(lblResumenRazonSocialResult,"wrap");

    lblResumenPeriodo = new JLabel("MY LABEL 33333333333333");
    lblResumenPeriodoResult = new JLabel("3333333333333333333333333333333333333333333333333333333");

    panel.add(lblResumenPeriodo);
    panel.add(lblResumenPeriodoResult);
    //poner el texto como html puede tener otra linea, porque es muy largo
    lblResumenFechaHora = new JLabel("<html>MY LABEL <br /> 4444444444444444</html>");
    lblResumenFechaHoraResult = new JLabel("4444444444444444444444444");

    panel.add(lblResumenFechaHora);
    panel.add(lblResumenFechaHoraResult);

    p.add(panel,"cell 0 0");

    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    getContentPane().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    setBounds(0, 0, 1250, 500);
    getContentPane().add(p);

    pack();
    setVisible(true);
    setLocationRelativeTo(null);
    setResizable(true);
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            MigLayoutMySCCEE test = new MigLayoutMySCCEE();

        }
    });
}
}
导入java.awt.Cursor;
导入java.awt.EventQueue;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入net.miginfocom.swing.MigLayout;
公共类miglayoutmyscee扩展JFrame{
专用JFrame主机;
私人JPanel小组;
私人JLabel lblResumenAuto;
私人JLabel lblresumenautresult;
私人JLabel lblResumenRazonSocial;
脉波重复间隔
p.add(panel, "cell 0 0, grow");
import java.awt.Cursor;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class MigLayoutMySCCEE extends JFrame{
private JFrame mainFrame;
private JPanel panel;

private JLabel lblResumenAuto;
private JLabel lblResumenAutoResult;
private JLabel lblResumenRazonSocial;
private JLabel lblResumenRazonSocialResult;
private JLabel lblResumenPeriodo;
private JLabel lblResumenPeriodoResult;
private JLabel lblResumenFechaHora;
private JLabel lblResumenFechaHoraResult;

public MigLayoutMySCCEE(){
    run();
}

public void run(){
    JPanel p = new JPanel();
    p.setLayout(new MigLayout("debug, fill","[grow]","[50:20:30]10[100::]10[20::]10[50!]10[20!]"));

    panel = new JPanel();
    panel.setLayout(new MigLayout("fillx", "[left, 15%]10[left, grow, 35%]10[left, 15%]10[left, grow, 35%]", "[center]10[center]"));

    lblResumenAuto = new JLabel("MY LABEL 1111111111111");
    lblResumenAutoResult = new JLabel("1111111111111111111111");

    panel.add(lblResumenAuto);
    panel.add(lblResumenAutoResult);

    lblResumenRazonSocial = new JLabel("MY LABEL 2222222222");
    lblResumenRazonSocialResult = new JLabel("2222222222222222222222");

    panel.add(lblResumenRazonSocial);
    panel.add(lblResumenRazonSocialResult,"wrap");

    lblResumenPeriodo = new JLabel("MY LABEL 33333333333333");
    lblResumenPeriodoResult = new JLabel("3333333333333333333333333333333333333333333333333333333");

    panel.add(lblResumenPeriodo);
    panel.add(lblResumenPeriodoResult);
    //poner el texto como html puede tener otra linea, porque es muy largo
    lblResumenFechaHora = new JLabel("<html>MY LABEL <br /> 4444444444444444</html>");
    lblResumenFechaHoraResult = new JLabel("4444444444444444444444444");

    panel.add(lblResumenFechaHora);
    panel.add(lblResumenFechaHoraResult);

    p.add(panel,"cell 0 0");

    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    getContentPane().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    setBounds(0, 0, 1250, 500);
    getContentPane().add(p);

    pack();
    setVisible(true);
    setLocationRelativeTo(null);
    setResizable(true);
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            MigLayoutMySCCEE test = new MigLayoutMySCCEE();

        }
    });
}
}