Java-Can';我不知道该用哪种布局?

Java-Can';我不知道该用哪种布局?,java,swing,layout,Java,Swing,Layout,我的布局非常完美,直到我不知道如何使拖放工作。为了简化编码,我将程序右下方的标签切换为按钮,以允许在主面板中单击生成对象 现在,我使用BoxLayout切换了它们,按钮的大小无法使图像完全适合它们,留下了如照片所示的边缘空间。我现在还有一个水平滚动条,这是以前标签上没有的 我尝试了几种不同的布局,试图修复这些按钮的大小,但我无法让事情正常进行。我只需要一个垂直滚动条,我希望按钮是图像的确切大小,就像他们在上面的面板。我尝试将布局设置为null,就像在所有其他面板中一样,并使用setBounds

我的布局非常完美,直到我不知道如何使拖放工作。为了简化编码,我将程序右下方的标签切换为按钮,以允许在主面板中单击生成对象

现在,我使用BoxLayout切换了它们,按钮的大小无法使图像完全适合它们,留下了如照片所示的边缘空间。我现在还有一个水平滚动条,这是以前标签上没有的

我尝试了几种不同的布局,试图修复这些按钮的大小,但我无法让事情正常进行。我只需要一个垂直滚动条,我希望按钮是图像的确切大小,就像他们在上面的面板。我尝试将布局设置为null,就像在所有其他面板中一样,并使用setBounds()方法,这非常适合放置,但随后滚动条消失,无法滚动

有人有什么建议吗

编辑:下面是我使用空布局时发生的情况


如果您使用swing,我真的建议您使用GridBag布局。其他布局还有很多需要改进的地方。这完全是一个偏好的问题,如果你愿意的话,你可以手动布局——没有正确的答案

我之所以喜欢GridBag(或MigLayout——各有各的),是因为您有组件的首选大小和填充的概念。我编写up Swing代码已经有一段时间了(我会尽量保持这种方式!),但您基本上是在寻找以下内容:

{
   //Pseudo Code, I'd have to go read the API again, I wrote a set of utilities so I    wouldn't have to think about it.
  GridBagConstraints constraints = ....;
  constraints.weightX = 1.0; //fill the area by X
  constraints.weightY = 1.0; //fill by Y
  constraints.fill = GridBagConstraints.BOTH; //or one...
  component.setPreferredSize(image.size());
  layout.add(component, constraints); 
}
基本上,你所做的是说“使用我的首选尺寸作为最低限度”,但填充基于这些规则

另一种方法——不使用布局,只需自己定位组件(这绝对没有错)

无论如何,有很多选择。不要觉得你需要使用布局,写你自己的。你应该关心这些事情,让它发挥作用,但你不应该受苦。布局通常很容易实现,您不应该害怕放弃它

尽管如此,GridBag会做你想做的事。或者,Mig很棒,有一些不错的GUI编辑器

更新->------------------------------- 这里有一个简明的例子——我真诚地不提倡这种编程风格,我只是不想把类垃圾邮件作为例子

   package _tests;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Grids extends JFrame
{
  private static final long serialVersionUID = 1L;

  public static void main(String ... args)
  {
    new Grids().setVisible(true);
  }

  public Grids()
  {
    //Null layout example
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(250, 300);
    setMinimumSize(new Dimension(285, 300)); //Windows 8 ~ border size + scrollbar
    setTitle("Test layouts");

    JPanel scrollTarget = new JPanel()
    {
      private static final long serialVersionUID = 1L;
      {
        setSize(250, 1000);
        setPreferredSize(new Dimension(250, 1000));
        //setLayout(null); -- uncomment for absolute
        setLayout(new GridBagLayout());

        int lastX = 0;
        int lastY = 0;
        for(int i = 0; i < 5; i++)
        {
          final String label = "Button " + i;
          JButton tmp = new JButton()
          {
            private static final long serialVersionUID = 1L;
            {
              setText(label);
              setPreferredSize(new Dimension(250, 200)); //Preferred
            }
          };

          tmp.setSize(tmp.getPreferredSize()); //What you're layout usually does..
          //add(tmp);
          //tmp.setLocation(lastX, lastY);
          //lastY += tmp.getHeight();

          add(tmp, getButtonConstraint(0, i));
        }
      }

    };

    add(new JScrollPane(scrollTarget));
    }



      private GridBagConstraints getButtonConstraint(int x, int y)
      {
        GridBagConstraints tmp = new GridBagConstraints();
        tmp.fill = GridBagConstraints.BOTH;
        tmp.weightx = 1.0;
        tmp.weighty = 1.0;
        tmp.gridx = x;
        tmp.gridy = y;
        tmp.anchor = GridBagConstraints.NORTHEAST;

        return tmp;
      }

}
package\u测试;
导入java.awt.Dimension;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
公共类网格扩展JFrame
{
私有静态最终长serialVersionUID=1L;
公共静态void main(字符串…参数)
{
新网格().setVisible(true);
}
公共电网()
{
//空布局示例
setDefaultCloseOperation(关闭时退出);
设置大小(250300);
setMinimumSize(新维度(285300));//Windows 8~边框大小+滚动条
setTitle(“测试布局”);
JPanel scrollTarget=新的JPanel()
{
私有静态最终长serialVersionUID=1L;
{
设置大小(2501000);
setPreferredSize(新尺寸(2501000));
//setLayout(null);--取消绝对值的注释
setLayout(新的GridBagLayout());
int lastX=0;
int-lastY=0;
对于(int i=0;i<5;i++)
{
最终字符串标签=“按钮”+i;
JButton tmp=newjbutton()
{
私有静态最终长serialVersionUID=1L;
{
setText(标签);
setPreferredSize(新维度(250200));//首选
}
};
tmp.setSize(tmp.getPreferredSize());//您的布局通常做什么。。
//添加(tmp);
//tmp设置位置(lastX,lastY);
//lastY+=tmp.getHeight();
添加(tmp,getButtonConstraint(0,i));
}
}
};
添加(新的JScrollPane(scrollTarget));
}
私有GridBagConstraints getButtonConstraint(int x,int y)
{
GridBagConstraints tmp=新的GridBagConstraints();
tmp.fill=GridBagConstraints.BOTH;
tmp.weightx=1.0;
tmp.weighty=1.0;
tmp.gridx=x;
tmp.gridy=y;
tmp.anchor=GridBagConstraints.NORTHEAST;
返回tmp;
}
}

这是我们学校教我们使用的。问题应该是,为什么java而不是C++?KrisPurdy在UI元素方面更具灵活性。在您的情况下,更重要的是为什么使用Swing而不是HTML5?使用CSS设计用户界面要容易得多!语言都是一样的,但是支持它们的框架对于快速构建一些东西更为重要。我更愿意使用VB,但是我们的类分配要求我们使用Java,而不是使用生成的代码。我认为我们的教授可能已经40年没有做过GUI了,并且认为用Java做GUI很简单。我上这门课是为了学习如何制作GUI,但我们所学的只是GUI的历史以及如何让GUI看起来不错,而不是如何创建或编写GUI=/@KrisPurdy检查QtQuick如果你还没有——如果你有像这样的小项目,而不是针对特定的课程,你会更快乐。这是更多的工作要开始,但回报是巨大的。这就是我使用空布局时发生的情况。我更喜欢使用这种布局,因为我使我的窗口全屏,不可调整大小,我可以把东西放在我想要的地方。但是当我使用null时,我无法使滚动条工作。我甚至强迫它使用一个滚动条,但它没有把一个小块放在那里,你可以拖动它滚动。你的容器面板有多大?(包含按钮的那一个?)你需要给它一个首选的大小,并为滚动窗格设置它,以便知道如何滚动它)目前,我的面板不是declar
   package _tests;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Grids extends JFrame
{
  private static final long serialVersionUID = 1L;

  public static void main(String ... args)
  {
    new Grids().setVisible(true);
  }

  public Grids()
  {
    //Null layout example
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(250, 300);
    setMinimumSize(new Dimension(285, 300)); //Windows 8 ~ border size + scrollbar
    setTitle("Test layouts");

    JPanel scrollTarget = new JPanel()
    {
      private static final long serialVersionUID = 1L;
      {
        setSize(250, 1000);
        setPreferredSize(new Dimension(250, 1000));
        //setLayout(null); -- uncomment for absolute
        setLayout(new GridBagLayout());

        int lastX = 0;
        int lastY = 0;
        for(int i = 0; i < 5; i++)
        {
          final String label = "Button " + i;
          JButton tmp = new JButton()
          {
            private static final long serialVersionUID = 1L;
            {
              setText(label);
              setPreferredSize(new Dimension(250, 200)); //Preferred
            }
          };

          tmp.setSize(tmp.getPreferredSize()); //What you're layout usually does..
          //add(tmp);
          //tmp.setLocation(lastX, lastY);
          //lastY += tmp.getHeight();

          add(tmp, getButtonConstraint(0, i));
        }
      }

    };

    add(new JScrollPane(scrollTarget));
    }



      private GridBagConstraints getButtonConstraint(int x, int y)
      {
        GridBagConstraints tmp = new GridBagConstraints();
        tmp.fill = GridBagConstraints.BOTH;
        tmp.weightx = 1.0;
        tmp.weighty = 1.0;
        tmp.gridx = x;
        tmp.gridy = y;
        tmp.anchor = GridBagConstraints.NORTHEAST;

        return tmp;
      }

}