6

短いバージョン:JDialogのsetMaximumSize()を機能させるには、何か注意が必要ですか?

フルバージョン:スクロールペインとコミットボタン付きの下部にJPanelを含むJDialog(レイアウトマネージャー:BorderLayout)があります。

スクロールペインには、システムの他の場所で動的に構築されるJPanelが含まれています。

私が欲しいのは、ダイアログがJPanelの周りで特定のサイズまで動的にサイズを変更してから、スクロールバーの拡大を開始することです。最大サイズが私のモニターのサイズであるように見えることを除いて、これは多かれ少なかれデフォルトで起こることです。

これはjava.awt.Componentから継承された.setMaximumSize()メソッドが行ったことだと思いましたが、設定しても効果がないようです。

好みのサイズを設定することには効果がありますが、ダイアログは何があっても常にそのサイズになります。これは私が望んでいるサイズではありません。

(スクロールペインで最大/優先サイズのプロパティを設定しても、効果は同じです。)

非常に明白な何かを見逃したことがありますか?私が知らない奇妙なJDialog/BorderLayout / MaximumSizeの相互作用はありますか?

4

4 に答える 4

9

スクロールペインのサイズ設定で説明したように、一部のコンポーネントは、ビューポートの優先サイズの設定に関する有用な情報を提供できます。のsetVisibleRowCount()方法JListは特に便利ですが、それでもgetViewport().setPreferredSize(…)十分な場合があります。当然、sscceが役立ちます。

補遺:具体的な例として、以下のダイアログは、最初はN -2行になるようにサイズ設定されています。さらに追加すると、数がNに達するまでダイアログが大きくなります。その時点で、スクロールバーは「成長」し始めます。この例ではを使用してJListいますが、どのScrollableコンポーネントも適応可能である必要があります。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

/** @see http://stackoverflow.com/questions/5759131 */
public class ListDialog {

    private static final int N = 12;
    private JDialog dlg = new JDialog();
    private DefaultListModel model = new DefaultListModel();
    private JList list = new JList(model);
    private JScrollPane sp = new JScrollPane(list);
    private int count;

    public ListDialog() {
        JPanel panel = new JPanel();
        panel.add(new JButton(new AbstractAction("Add") {

            @Override
            public void actionPerformed(ActionEvent e) {
                append();
                if (count <= N) {
                    list.setVisibleRowCount(count);
                    dlg.pack();
                }
            }
        }));
        for (int i = 0; i < N - 2; i++) {
            this.append();
        }
        list.setVisibleRowCount(N - 2);
        dlg.add(sp, BorderLayout.CENTER);
        dlg.add(panel, BorderLayout.SOUTH);
        dlg.pack();
        dlg.setLocationRelativeTo(null);
        dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dlg.setVisible(true);
    }

    private void append() {
        model.addElement("String " + String.valueOf(++count));
        list.ensureIndexIsVisible(count - 1);
    }

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

            @Override
            public void run() {
                ListDialog pd = new ListDialog();
            }
        });
    }
}
于 2011-04-22T21:10:39.160 に答える
6

パネルの実装をスクロール可能にする方法です。(Trashgodがすでに提供しているチュートリアルリンクに加えて)Robのブログエントリも参照してください。

http://tips4java.wordpress.com/2009/12/20/scrollable-panel/

それから:

1)一般的なコンテンツに適した用語でgetPreferredScrollableViewportSize()を実装します(表示する行の優先数であるJList fiの場合、別名:visibleRowCount)
2)これらの「合理的な用語」のセッター/ゲッターを実装します

その追加のレイヤー(「合理的な用語」を調整する)により、すべてのコラボレーションコンポーネントは、setXXSize(これは決してありません。これらのメソッドが存在することを忘れるだけです;)

于 2011-04-23T09:54:37.300 に答える
2

JDialogのサイズを設定するpack()メソッドは、getPreferredSize()の呼び出しに依存して、使用するサイズを決定します。

JDialogをサブクラス化する場合、このメソッドをサブクラス化することで最大サイズを適用できます。

例:

@Override 
public Dimension getPreferredSize() {    
  int maxWidth=500;    
  int maxHeight=300;    
  Dimension dim=super.getPreferredSize();    
  if (dim.width>maxWidth) dim.width=maxWidth;    
  if (dim.height>maxHeight) dim.height=maxHeight;    
  return dim; 
}
于 2011-06-10T17:39:19.200 に答える
1

単純な例getSize()の中のJComponentsから計算する必要がありますJScrollPane

編集:そしてJDialog#pack()を呼び出す

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class PackDialog {
    private JDialog dlg;
    private JScrollPane scrollPane;
    private JPanel panel;
    private JButton btn;

    public PackDialog() {
        btn = new JButton();
        btn.setPreferredSize(new Dimension(300, 30));
        btn.addActionListener(new java.awt.event.ActionListener() {

            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnActionPerformed(evt);
            }

            private void btnActionPerformed(ActionEvent evt) {
                int h = panel.getHeight();
                h += btn.getHeight();
                int w = panel.getWidth();
                dlg.setPreferredSize(new Dimension(w, h));
                dlg.pack();
            }
        });
        panel = new JPanel();
        panel.setPreferredSize(new Dimension(300, 600));
        panel.setLayout(new BorderLayout(10, 10));
        panel.add(btn, BorderLayout.SOUTH);
        scrollPane = new JScrollPane(panel);
        dlg = new JDialog();
        dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dlg.setPreferredSize(new Dimension(400, 300));
        dlg.add(scrollPane);
        dlg.pack();
        dlg.setVisible(true);
    }

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

            @Override
            public void run() {
                PackDialog pd = new PackDialog();
            }
        });
    }}
于 2011-04-22T19:58:56.780 に答える