Java - 不知道要使用哪种布局?

标签 java swing layout

我的布局非常完美,直到我想不出如何进行拖放操作。因此,为了使编码更容易,我将程序右下角的标签切换为按钮,以允许单击以在主面板中生成一个对象。

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

enter image description here

我已经尝试了几种不同的布局来尝试修复这些按钮的大小,但我无法使它们正常工作。我只需要一个垂直滚动条,我希望按钮的大小与图像的大小一致,就像它们在它们上方的面板中一样。我尝试将布局设置为空,就像我在所有其他面板中所做的那样,并使用 setBounds() 方法,这非常适合放置,但随后滚动条消失并且不会滚动。

有人有什么建议吗?

编辑:这是我使用 null 布局时发生的情况。

enter image description here

最佳答案

如果您使用 swing,我真的建议您使用 GridBag 布局。其他布局还有很多不足之处。这完全取决于您的喜好,您可以根据需要手动进行布局——没有正确答案。

我更喜欢 GridBag(或 MigLayout——而不是它们各自的)的原因是您对组件的首选大小和填充的概念有一个概念。自从我编写 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); 
}

基本上您所做的是说“使用我的首选尺寸作为最小尺寸”,但要根据这些规则进行填充。

不使用布局的替代方法是自己简单地定位组件(这绝对没有错)。

{
  JPanel panel =...;
  panel.setLayout(null);

  ...
  myButton3.setX(0);
  myButton3.setY(2 * buttonHeight); //third button
  myButton.setSize(myButton.getPreferredSize()); //which I assume you set
  ...
  panel.add(myButton3);
  ...
}

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

综上所述,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;
      }

}

关于Java - 不知道要使用哪种布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19710358/

相关文章:

java - Java中如何通过Socket接收纯文本

html - 将内容放在较短的列下方

android - 如何支持多屏维度

java - KeyEvent.SHIFT_DOWN_MASK 与 KeyEvent.SHIFT_MASK

java - UIWebView 风格的 Java 组件

android - 应用程序崩溃了..找到了有关logcat的解释,但不知道为什么

java - Android ListView ,如何无边距定位 ListView ?

java - 使用改进的多部分 POST 请求发送大文件时出错

java - 如何使用 Java FB Business SDK 获取 Facebook 广告帐户的转化?

来自 unix 机器的 Java Swing ComboBox 文件列表