2015-02-05 117 views
3

我使用兩個JSplitPanes來顯示一些信息。一個是水平分隔器,另一個是垂直分隔器。以下問題適用於JSplitPanesJFrame調整大小移動JSplitPane分隔線

當我調整我的應用程序的主JFrame,該JSplitPanes也調整,因爲他們佔據了屏幕的一定比例(全部JPanels調整爲JFrame調整大小,行爲由MigLayout的寬度和高度參數設定)。

分隔符的位置很重要,需要與JSplitPane的大小保持一致。我使用setResizeWeight()setDividerLocation()來實現這一點。

的主要問題是,在調整大小JFrame,分隔不保持在0.0/0%,而是移動到〜5-10%:

Pre-resize -----> Post-resize

我認爲這是由於resizeWeight,但我玩了它,並沒有改變行爲。

有人可以幫我解決這個問題嗎?我實現了一個ComponentAdapter,但是沒有將分頻器的位置保存在一個變量中或Preferences XML-key我無法恢復componentResized()上的分頻器位置。

示例代碼:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSplitPane; 

import net.miginfocom.swing.MigLayout; 


public class JSplitPaneTest { 

    public static void main(String[] args) { 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setMinimumSize(new Dimension(500, 500)); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new MigLayout()); 

     JPanel panel1 = new JPanel(); 
     panel1.setBackground(Color.RED); 

     JPanel panel2 = new JPanel(); 
     panel1.setBackground(Color.GREEN); 

     final JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 
       panel1, panel2); 
     splitPane.setResizeWeight(0.5); 
     splitPane.setOpaque(false); 
     splitPane.setOneTouchExpandable(true); // does not work on Linux :(
     splitPane.setBorder(null); 

     mainPanel.add(splitPane, "w 100%, h 90%, wrap"); 

     JButton button = new JButton("Set to 0"); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       splitPane.setDividerLocation(0.0); 
      } 
     }); 

     mainPanel.add(button, "span"); 

     frame.add(mainPanel); 
     frame.setVisible(true); 
    } 
} 
+0

更快地發佈SSCCE/MCVE,短小,可運行,可編譯 – mKorbel 2015-02-05 18:21:10

+0

我已添加示例代碼。 setResizeWeight()確實改變了行爲。但分頻器從來沒有真正停留在0。 – ChrisK 2015-02-05 18:48:23

回答

1

我在同一個項目的工作@ChrisK並看了看這個今天。我相信我已經解決了這個問題,雖然我還沒有確認由窗口大小調整引起的特定症狀(因爲我們移動到靜態大小的jSplitPane並調整窗口大小並不會改變分隔符位置)。但是,我們遇到了另一個問題,我認爲這是由相同的基礎問題引起的:在從位置0移動分隔符之後,不能再手動將分隔符拖回到位置0.原來這是由於jPanel的最小尺寸,這從未明確設置。事實證明,leftComponent.getMinimumSize()正在返回(隨機/任意?)32,這正好是分割器無法拖過去的最左側像素位置。

因此,我所做的就是調用:

panel1.setMinimumSize(new Dimension(0,0)); 

允許分頻器被一路拖到左邊/頂部和:

panel2.setMinimumSize(new Dimension(0,0)); 

,讓分隔成一直拖到右側/底部。

我相信這些值會干擾組件大小調整時的分隔位置。我無法弄清爲什麼設定了面板尺寸的表面上任意最小值(32x47)。這些值在構造面板後立即由getMinimumSize返回。如果有人知道如何計算這些數據,它可能會提供更完整的情況。如果有幫助,分隔符拖動尺寸中的分隔窗格的寬度/高度靜態設置爲180.

+0

回到一年前,當我做了一些研究,我看到[這篇文章](https://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in -java-SWI)。這可能是一個有趣的閱讀。 – ChrisK 2016-03-05 13:03:32

+0

你應該關於這個問題留言@kleopatra,因爲我目前的工作是目前唯一的解決方案。我承認這可能不是明智之舉,儘管我不像你那麼熟悉Swing,但我認爲你認爲分割窗格分割器的這種行爲是一個bug,如果是這樣的話,那麼直到它被修復,似乎你所能做的只是解決它。 – hepcat72 2016-03-06 15:36:47

+0

您認爲我們應該重寫getminimumsize而不是第二個答案中的呼叫集最小大小嗎? – hepcat72 2016-03-06 15:51:51