2

ドラッグアンドドロップを機能させる方法がわからなくなるまで、レイアウトは完璧でした。そこで、コーディングを簡単にするために、プログラムの右下にあるラベルをボタンに切り替えて、シングル クリックでメイン パネルにオブジェクトを生成できるようにしました。

BoxLayout を使用してそれらを切り替えたので、画像が完全に収まるようにボタンのサイズを変更することができず、写真に見られるように端のスペースが残ります。また、以前はラベルになかった水平スクロール バーもあります。

ここに画像の説明を入力

これらのボタンのサイズを修正するために、いくつかの異なるレイアウトを試しましたが、うまく動作しません。垂直スクロールバーが必要なだけで、ボタンが上のパネルにあるように、ボタンを画像の正確なサイズにしたい. 他のすべてのパネルと同じようにレイアウトを null に設定し、setBounds() メソッドを使用してみましたが、配置には完全に機能しますが、スクロール バーが消えてスクロールしません。

誰にも提案はありますか?

編集: null レイアウトを使用するとどうなるかを次に示します。

ここに画像の説明を入力

4

1 に答える 1

2

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;
      }

}
于 2013-10-31T15:47:22.100 に答える