2012-03-19 5 views
2

JScrollPaneオブジェクトに含まれるJTableオブジェクトによって、MigLayoutが混乱するように見えます。 JScrollPane内にJTableを持つのは普通のイディオムである可能性が高いと思われるので、なぜそれを見つけるのが重要だと思いました。JScrollBarオブジェクトに含まれるJTableオブジェクトによって混乱するMigLayout

添付のサンプルプログラムでは、12行4列の簡略化されたフォームが作成されています。すべての幅と高さはパーセンテージとして設定されます。複数のコンポーネントがフォームに追加され、すべてがセルの位置になります。いくつかの行または列にまたがっています。最後の列には、セル行のインデックスとサイズの割合が表示されます。

引数 "JLabel"でプログラムを開始すると、JSCrollPaneに含まれるJLabelが列0に追加され、すべての整列が良好になります。プログラムが引数 "JTable"で開始されている場合、すべての列の行サイズは中断されます。

これはバグですか?または機能ですか?

Make: javac -classpath <path to miglayout> migtest.java 
Usage: java -classpath <path to miglayout> migtest <JTable|JLabel> 

注:下のコードが難しく表示されている場合(タブなし)、さまざまなペースト方法を試しました。プレビューを正しく表示できませんでした。それを修正するために私ができることがあれば教えてください。

答えの私は本当に;-)それらを掘り下げるするだけでザッタイプのためにあまりにも多くの(コンポーネントの制約がたくさんあります
import java.awt.*; 
import java.awt.event.*; 
import java.net.*; 
import java.util.*; 
import java.io.*; 
import java.text.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.filechooser.*; 
import javax.swing.table.*; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableColumn; 
import net.miginfocom.swing.MigLayout; 

public class Migtest extends JFrame { 
    public final static int appWidth = 1200; // default 

    public final static int appHeight = 800; // default 

    String[] clientColNames = { "Name", "Address", "Alternate Address" }; 

    JComponent createClientsPane(int numCols, String arg) { 
     if (arg.equals("jtable")) { 
      JTable clientsTable = new JTable(1, numCols); 
      clientsTable.getTableHeader().setReorderingAllowed(false); 
      clientsTable.getSelectionModel().setSelectionMode(
        ListSelectionModel.SINGLE_SELECTION); 
      clientsTable.getSelectionModel().setSelectionInterval(0, 0); 
      JScrollPane scrollPane = new JScrollPane(clientsTable); 
      return scrollPane; 
     } else 
      return new JScrollPane(new JLabel("bear tenders")); 
    } 

    void init(String[] args) { 
     JPanel topPanel = null, subpanel = null; 
     String arg; 
     if (args.length != 1) { 
      System.out.println("missing arg - s/b 'JLabel' or 'jTable'"); 
      System.exit(0); 
     } 
     arg = args[0].trim().toLowerCase(); 
     if (!arg.equals("jlabel") && !arg.equals("jtable")) { 
      System.out.println("missing arg - s/b 'JLabel' or 'jTable'"); 
      System.exit(0); 
     } 
     setSize(appWidth, appHeight); 
     topPanel = new JPanel(new MigLayout("fill,debug", 
       "[30%][15%][50%][5%]", 
       "[5%][7%][5%][10%][7%][7%][7%][7%][6%][7%][2%][30%]")); 
     JCheckBox dynamicInstrumentCheckbox = new JCheckBox(
       "Wood Activities Enabled", false); 
     topPanel.add(dynamicInstrumentCheckbox, "cell 0 2"); 
     topPanel.add(new JLabel("BEAR TENDERS"), "cell 0 4, alignx center"); 
     topPanel.add(createClientsPane(clientColNames.length, arg), 
       "cell 0 5, spany 4, grow"); 
     topPanel.add(new JLabel("BEAR FACTS"), "cell 1 4, alignx center"); 
     JRadioButton noneButton = new JRadioButton("None"); 
     topPanel.add(noneButton, "cell 1 5, gapleft 2%"); 
     JRadioButton rangeButton = new JRadioButton("Fact 1"); 
     topPanel.add(rangeButton, "cell 1 6, gapleft 2%"); 
     JRadioButton playbackButton = new JRadioButton("Fact 2"); 
     topPanel.add(playbackButton, "cell 1 7, gapleft 2%"); 
     JButton controlsButton = new JButton("Controls =>"); 
     topPanel.add(controlsButton, "cell 1 8, alignx center"); 
     topPanel.add(new JLabel("GUMMY BEARS"), "cell 2 1, alignx center"); 
     topPanel.add(new JLabel("(gummy bears)"), "cell 2 2, spany 4, grow"); 
     topPanel.add(new JLabel("CHICAGO BEARS"), "cell 2 6, alignx center"); 
     topPanel.add(new JLabel("(chicago bears)"), "cell 2 7, spany 3, grow"); 
     topPanel.add(new JLabel("LOG"), "cell 0 10, alignx left"); 
     JButton clearLogButton = new JButton("Clear Log"); 
     topPanel.add(clearLogButton, "cell 2 10, alignx right"); 
     topPanel.add(new JLabel("(log pane)"), "cell 0 11, spanx 3, grow"); 
     topPanel.add(new JLabel("0-5%"), "cell 3 0, grow"); 
     topPanel.add(new JLabel("1-7%"), "cell 3 1, grow"); 
     topPanel.add(new JLabel("2-5%"), "cell 3 2, grow"); 
     topPanel.add(new JLabel("3-10%"), "cell 3 3, grow"); 
     topPanel.add(new JLabel("4-7%"), "cell 3 4, grow"); 
     topPanel.add(new JLabel("5-7%"), "cell 3 5, grow"); 
     topPanel.add(new JLabel("6-7%"), "cell 3 6, grow"); 
     topPanel.add(new JLabel("7-7%"), "cell 3 7, grow"); 
     topPanel.add(new JLabel("8-6%"), "cell 3 8, grow"); 
     topPanel.add(new JLabel("9-7%"), "cell 3 9, grow"); 
     topPanel.add(new JLabel("10-2%"), "cell 3 10, grow"); 
     topPanel.add(new JLabel("11-30%"), "cell 3 11, grow"); 
     setContentPane(topPanel); 
    } 

    public static void main(String[] args) { 
     try { 
      Migtest thisTest = new Migtest(); 
      thisText.init(args); 
//   thisTest.init(new String[] {"jLabel"}); 
//   thisTest.init(new String[] {"jTable"}); 

      // center app window 
      GraphicsConfiguration gc = thisTest.getGraphicsConfiguration(); 
      Rectangle bounds = gc.getBounds(); 
      thisTest.setLocation(
        (int) ((bounds.width - thisTest.appWidth)/2), 
        (int) ((bounds.height - thisTest.appHeight)/2)); 
      thisTest.setVisible(true); 
     } catch (Exception e) { 
      System.out.println("runTest caught exception: " + e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 
} // class test 
+0

Javaの命名規則を学び、それらに固執してください(私はあなたのためにここで行いました。小文字のclassName :-)を負うことはできません。 – kleopatra

+0

コードの書式設定に関して:あなたのコードのいくつか(私のIDEがそれを修正する前に試していない:-)? – kleopatra

答えて

5

:テーブル対ラベルの間の差異があることである

後者の実装スクロール、特にそのこれは残念ながら、テーブルの初期化コードでハードコードされた固定された寸法、返すために実装され

Dimension getPreferredScrollableViewportSize(); 

setPreferredScrollableViewportSize(new Dimension(450, 400)); 
0を

あなたが望むことはめったにありません。

MigLayoutへの影響は、かなり広い領域(実際の行のインデント)がそのセルをオーバーフローさせ、他のセルが縮小する必要があることです。

うち、あなたのコンテキスト内での方法は、単にnullにprefViewportを設定することです:

clientsTable.setPreferredScrollableViewportSize(null); 

(強調はあなたのコンテキストであることを編集ノート - 異なるLayoutManagersが混同され、recent questionを参照してください)

さらに一般的な解決策は、ゲッターをより合理的な何かに実装することですレイアウトマネージャは、同様にそれがかもしれないなどのコンポーネントを処理していない場合

@Override 
public Dimension getPreferredScrollableViewportSize() { 
    if (preferredViewportSize == null) { // hasn't been hard-coded 
     if (visibleRowCount < 0) { // a property similar as in JList 
      return getPreferredSize(); // use the actual size 
     } else { 
      Dimension pref = getPreferredSize(); 
      // calculate height based on # rows that should be visible 
      pref.height = .... 
      return pref; 
     } 
    } 
    return super.getPr... 
} 
+0

華麗!提案されたtweekは、問題を解決するように見えます。 – nferguso

+0

@kleopatraありがとう – mKorbel

0

私も不思議(JXTableが何をするか、おおよそ、ではないが、正確に)#OF行の観点から優先度を計算します。スクロールされたJTableコンポーネントに "spany"という用語が追加されていない限り、全体のレイアウト行間隔に悪影響はありません。また、私のアプリケーションのレイアウトをちょっとだけジグリングすることで、すべてが大丈夫なアレンジメントが見つかりました。私のアプリケーションには、この例の中で取り残したダイアログのJTableコンポーネントがいくつかスクロールされています。時にはレイアウトマネージャーがスペースを正しく取れるように見えることがあります。しかし、おそらく私はおそらくstackoverflowの範囲を超えています。 (私はmiglayout.comに質問を提出するつもりだったが、私はサポートフォーラムに登録することができなかった。) ご協力ありがとうございます。

関連する問題