2015-02-05 118 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