问题描述
我有一个包含两个 JPanel 的 JFrame,一个是 menuBar,另一个是框架的主体。我希望将主体分成三个 JScrollPanes,以便它们可以扩展或缩小尺寸。我嵌套了两个 JSplitPanes 来实现这一点。我的问题是我为 JSplitPanes 定义的 setDividerLocation 和 setPreferredSize 不起作用。我尝试了 resetToPreferredSizes 并且这对 JFrame 也没有明显的影响。
这是我的代码:
public class HomeView {
private JFrame frame;
private JPanel top;
private JPanel center;
private JPanel bottom;
private JScrollPane lPane;
private JScrollPane cPane;
private JScrollPane rPane;
private JSplitPane cr;
private JSplitPane lcr;
public static void main(String[] args) {
EventQueue.invokelater(new Runnable() {
public void run() {
try {
HomeView window = new HomeView();
window.frame.setVisible(true);
window.cr.resetToPreferredSizes();
} catch (Exception e) {
e.printstacktrace();
}
}
});
}
public HomeView() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setDefaultCloSEOperation(JFrame.disPOSE_ON_CLOSE);
frame.setSize(Constants.pcSize);
frame.setBackground(Color.BLACK);
top = new JPanel();
top.setBackground(P.light);
center = new JPanel();
center.setBackground(P.mix);
bottom = new JPanel();
bottom.setBackground(P.lightGrey);
GroupLayout groupLayout = new GroupLayout(frame.getContentPane());
groupLayout.setHorizontalGroup(groupLayout.createParallelGroup(Alignment.TRAILING)
.addGroup(groupLayout.createSequentialGroup().addGap(P.Xa)
.addComponent(top,GroupLayout.DEFAULT_SIZE,C.mWidth,Short.MAX_VALUE).addGap(P.Xa))
.addGroup(groupLayout.createSequentialGroup().addGap(P.Xb)
.addComponent(center,C.pWidth,Short.MAX_VALUE).addGap(P.Xb))
.addGroup(groupLayout.createSequentialGroup().addGap(P.Xc)
.addComponent(bottom,C.bWidth,Short.MAX_VALUE).addGap(P.Xc)));
groupLayout.setVerticalGroup(groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup().addGap(P.H1)
.addComponent(top,C.mHeight,Short.MAX_VALUE).addGap(P.H2)
.addComponent(center,C.pHeight,Short.MAX_VALUE).addGap(P.H3)
.addComponent(bottom,C.bHeight,Short.MAX_VALUE).addGap(P.HZ)));
lPane = new JScrollPane();
lPane.setPreferredSize(new Dimension(C.lWidth,C.lHeight));
cPane = new JScrollPane();
cPane.setPreferredSize(new Dimension(C.cWidth,C.cHeight));
rPane = new JScrollPane();
rPane.setPreferredSize(new Dimension(C.rWidth,C.rHeight));
cr = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,cPane,rPane);
cr.setPreferredSize(new Dimension(C.crWidth,C.crHeight));
cr.setDividerSize(P.D);
cr.setDividerLocation(0.8125);
cr.setBorder(BorderFactory.createCompoundBorder());
cr.resetToPreferredSizes();
lcr = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,lPane,cr);
lcr.setDividerSize(P.D);
lcr.setDividerLocation(0.2);
lcr.setBorder(BorderFactory.createCompoundBorder());
lcr.resetToPreferredSizes();
GroupLayout layoutC = new GroupLayout(center);
layoutC.setHorizontalGroup(
layoutC.createParallelGroup(Alignment.LEADING).addGroup(layoutC.createSequentialGroup().addGap(0)
.addComponent(lcr,C.lcrWidth,GroupLayout.DEFAULT_SIZE).addGap(0)));
layoutC.setVerticalGroup(layoutC.createParallelGroup(Alignment.LEADING).addGroup(layoutC.createSequentialGroup()
.addGap(0).addComponent(lcr,C.lcrHeight,GroupLayout.DEFAULT_SIZE).addGap(0)));
center.setLayout(layoutC);
frame.getContentPane().setLayout(groupLayout);
frame.pack();
}
}
我的 C 和 P 类只是存储值。
public class P {
public static int Xa = 0;
public static int Xb = 1;
public static int Xc = 1;
public static int H1 = 0;
public static int H2 = 1;
public static int H3 = 1;
public static int HZ = 0;
public static int D = 4;
public static Color white = new Color(255,255,255);
public static Color black = new Color(0,0);
public static Color dark = new Color(60,60,60);
public static Color light = new Color(220,220,255);
public static Color mix = new Color(150,180,210);
public static Color javaDefault = new Color(204,204,204);
public static Color distinct = new Color(180,55,55);
public static Color ciel = new Color(0,55);
public static Color darkGrey = new Color(88,88,88);
public static Color lightGrey = new Color(230,230,230);
}
public class C {
public static Dimension pcSize = Toolkit.getDefaultToolkit().getScreenSize();
private static String s = File.separator;
public static File defaultFile = new File("Metadata" + s + "default");
public static File userFile = new File("Metadata" + s + "user");
private static int tolR = 8;
private static int tolL = 8;
private static int tolT = 31;
private static int tolB = 8;
public static int pcWidth = pcSize.width;
public static int pcHeight = pcSize.height;
public static int sHeight = pcHeight - tolT - tolB;
public static int sWidth = pcWidth - tolR - tolL;
public static int mHeight = (int) ((double) (sHeight * 0.062));
public static int mWidth = sWidth - (2 * P.Xa);
public static int bHeight = (int) ((double) (sHeight * 0.0345));
public static int bWidth = sWidth - (2 * P.Xc);
public static int pHeight = sHeight - P.H1 - mHeight - P.H2 - P.H3 - bHeight - P.HZ;
public static int pWidth = sWidth - (2 * P.Xb);
public static int lHeight = pHeight;
public static int lWidth = (int)((double) (sWidth * 0.2));
public static int cHeight = pHeight;
public static int cWidth = (int)((double) (sWidth * 0.65));
public static int rHeight = pHeight;
public static int rWidth = sWidth - lWidth - cWidth;
public static int crWidth = cWidth + rWidth;
public static int crHeight = cHeight;
public static int lcrWidth = pWidth;
public static int lcrHeight = pHeight;
}
我的结果: 这不是预期的首选大小或分隔符位置。我尝试删除它们,但输出没有变化。我希望有人能帮我发现哪里出了问题?。耐心等待。
解决方法
cr.setDividerLocation(0.8125);
setDividerLocation( double )
方法仅适用于“已实现”的框架。也就是说,在调用布局管理器之前,组件没有大小。因此,在调用 pack()
方法之前,您需要在框架上调用 setVisible(true)
或 setDividerLocation()
。
然而,这并不是一个好的解决方案,因为您的课程设计不当。您的 HomeView
班级不应了解有关框架的任何信息。它应该是一个独立的组件,就像可以添加到任何框架或对话框的 JLabel 或 JButton。框架应在您的 main() 方法中创建。
那么更好的解决方案是在您的类的构造函数中将代码包装在 SwingUtilities.invokeLater()
中,将代码添加到 Event Dispatch Thread (EDT)
的末尾,以确保代码在框架可见后执行。类似的东西
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
cr.setDividerLocation(0.8125);
}
});
阅读 How to Use Split Panes 上的 Swing 教程。 SplitPaneDemo
代码将演示如何更好地构建您的代码。