2017-08-28 19 views
1

私はそれらの間に50%の区切りを持つJSPlitPaneを持っています。 正しく動作します。Jsplitpaneは自動的にサイズ変更されます

しかし、右側にいくつかのJLabelを追加すると、jsplitpaneは私の50%のディバイダを無視し、左側のペインはサイズを増やし、右側を縮めます。

なぜこれが起こり、それを修正するのですか?

私のコードは次のとおりです。

import javax.swing.*; 
import java.awt.*; 

public class Example { 

    private static void setup() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(500, 500)); 
     frame.setFocusable(true); 

     JSplitPane pane= new JSplitPane(); 
     pane.setResizeWeight(0.5); 
     pane.setRightComponent(new JPanel()); 

     JPanel myPanel = new JPanel(); 
     myPanel.setLayout(new FlowLayout()); 

     for(int i=0; i<20; i++) myPanel.add(new JLabel("hello")); 

     pane.setLeftComponent(myPanel); 

     frame.add(pane); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       setup(); 
      } 
     }); 
    } 
} 

答えて

2
しかし

私は右側にいくつかのJLabelを追加するとき、その後、JSplitPaneのは、私の50%分圧器の事を無視し、左側のペインには、そのサイズが大きくなり、ちょうどカボチャ右手側。

分割ペインは、最初に各コンポーネントの推奨サイズを計算します。

サイズ変更の重みは、分割ペインのサイズを変更するときにスペースを割り当てるためのものです。この場合、フレームが表示されたときに発生します。したがって、フレームが表示されたときに、分割ペインに追加されるコンポーネントの推奨サイズが分割ペインのサイズより小さい場合、各コンポーネントは余分なスペースの50%を取得します。

最初のケースではコンポーネントがないので、各パネルの好ましいサイズは同じです。したがって、分割ペインのサイズを変更すると、それぞれ同じスペースが得られます。

第1のパネルの好ましいサイズは、パネルに追加されたすべてのラベルの幅であり、第2のパネルは0である。第1のパネルの好ましい幅は、フレームのサイズ2番目のパネルに割り当てる余分なスペースはありません。

20の代わりに1つまたは2つのラベルを追加して、何が起こるかを確認してください。

編集:

いくつかの問題:

1)ご想像のとおりリサイズ重量は動作しません。除算器が低速として動かされると、各ピクセルについてイベントが生成される。ピクセルを両方のコンポーネントで共有することはできませんので、ピクセルは右側のコンポーネントに渡されます。

解決策は、ラベルコンポーネントがすべてのスペースを取得できるように、サイズ変更ウェイト「1.0」を使用することをお勧めします。

2)JSplitPaneはコンポーネントの最小サイズを基準にしているため、コンポーネントの最小サイズを超えてバーをドラッグすることはできません。パネルの最小サイズは推奨サイズと同じですので、分割線を小さくドラッグすることはできません。

溶液を

いくつかのより小さな寸法を返すために、パネルの getMinimumSize()メソッドをオーバーライドすることである
  • 分割区画の大きさはときに50%に手動で分周位置を設定します分割ペインが最初に表示されます。
  • これは、setDividerLocation(...)メソッドをSwingUtilities.invokeLater()にラップすることによって行うことができます。

    上記3つの提案は、あなたのMCVEに追加されました。

    import javax.swing.*; 
    import java.awt.*; 
    
    public class Example { 
    
        private static void setup() { 
         JFrame frame = new JFrame(); 
         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
         frame.setPreferredSize(new Dimension(500, 500)); 
         frame.setFocusable(true); 
    
         JSplitPane pane= new JSplitPane(); 
         pane.setResizeWeight(1.0); 
         pane.setRightComponent(new JPanel()); 
    
         JPanel myPanel = new JPanel() 
         { 
          @Override 
          public Dimension getMinimumSize() 
          { 
           return new Dimension(50, 50); 
          } 
         }; 
         myPanel.setLayout(new FlowLayout()); 
    
         for(int i=0; i<20; i++) myPanel.add(new JLabel("hello")); 
    
         pane.setLeftComponent(myPanel); 
    
         frame.add(pane); 
    
         frame.pack(); 
         frame.setVisible(true); 
    
         javax.swing.SwingUtilities.invokeLater(new Runnable() { 
          public void run() { 
           pane.setDividerLocation(0.5f); 
          } 
         }); 
        } 
    
        public static void main(String[] args) { 
         javax.swing.SwingUtilities.invokeLater(new Runnable() { 
          public void run() { 
           setup(); 
          } 
         }); 
        } 
    } 
    
    +0

    'しかし、その20件のJLabelが、そのスペースfirst'を埋めることはできません下の空間の山があるが - 別のレイアウトマネージャを使用してください。 FlowLayoutのルールは、すべてのコンポーネントが1行に表示されていることを前提に、適切なサイズが計算されることです。 '私は厳密に50%の比率を望んでいます - 再びあなたは' setResizeWeight() 'メソッドの使い方を理解していません。このメソッドは、分割ペインに追加された各コンポーネントの推奨サイズに基づいて領域が割り当てられた後にのみ適用されます。 – camickr

    +0

    どのようにレイアウトマネージャー私は50%の比率を維持することができるようにも、jlabelsが正しく表示されるように使用する? – Skux

    +0

    JSplitPaneを使用しないでください。これは、分割ペインがどのように動作するように設計されているかではありません。分割ペインを使用するポイントは、各コンポーネントが独自の優先サイズを決定し、必要に応じて余分なスペースを割り当てることです。その後、ユーザーは必要に応じて仕切りを調整することができます。各コンポーネントを50%にしたい場合は、GridLayoutを使用することができます。 – camickr

    関連する問題