我想要3个可调整大小的水平JPanel。它工作正常,但我无法设置第一个JSlitPane的位置:sp.setDividerLocation(.3);
不起作用。
public class JSplitPanelProva extends JFrame {
public JSplitPanelProva() {
this.setLayout(new BorderLayout());
JPanel leftPanel = new JPanel();
leftPanel.setBackground(Color.BLUE);
JPanel centerPanel = new JPanel();
centerPanel.setBackground(Color.CYAN);
JPanel rightPanel = new JPanel();
rightPanel.setBackground(Color.GREEN);
JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, centerPanel);
JSplitPane sp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sp, rightPanel);
sp.setOneTouchExpandable(true);
sp2.setOneTouchExpandable(true);
this.add(sp2, BorderLayout.CENTER);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(1000, 600);
this.setVisible(true);
sp.setDividerLocation(.3);
sp2.setDividerLocation(.6);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new JSplitPanelProva();
}
}
答案 0 :(得分:2)
变化:
sp2.setDividerLocation(.6);
ActionListener splitListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sp.setDividerLocation(.3);
}
};
Timer t = new Timer(200, splitListener);
t.setRepeats(false);
t.start();
要:
main
它将按预期工作。延迟为GUI重新计算大小提供了时间。
答案 1 :(得分:2)
看起来需要做三件事:
Event Dispatch Thread (EDT)
以下代码将完成所有3:
this.setVisible(true);
sp2.setDividerLocation(.6);
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
sp.setDividerLocation(.3);
}
});
注意:应在EDT上创建所有Swing组件。所以你也应该使用以下内容来创建框架:
EventQueue.invokeLater(new Runnable()
{
public void run()
{
new JSplitPaneProva();
}
});
答案 2 :(得分:1)
setDividerLocation(double proportionalLocation)
方法的文档说:
如果未正确实现拆分窗格并且在屏幕上显示此方法 将没有效果(新的分隔符位置将成为(当前大小* proportionalLocation)是0)。
您可以做的是使用setDividerLocation(int location)
方法,如下所示:
sp.setDividerLocation(300);
sp2.setDividerLocation(600);