从右侧设置 JSplitPane 分隔线位置
Set JSplitPane divider location from the right
据我所知,JSplitPane的setDivider()
方法可以接受一个int,它是从左边开始的绝对位置。例如,someSplitPane.setDivider(120);
会将分隔线设置为距左侧 120px。有什么方法可以做同样的事情,但将分隔线设置为从右边开始的绝对位置?
实现简单:
public class Window extends JFrame {
JSplitPane splitpane;
public Window() {
initComponents();
}
private void initComponents() {
setTitle("Debugging");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setMinimumSize(new Dimension(640, 480));
splitpane = new JSplitPane();
System.out.println(splitpane.getSize().width); // prints 0
splitpane.setDividerLocation(splitpane.getSize().width - 120);
getContentPane().add(splitpane);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new Window().setVisible(true);
});
}
}
编辑:我编写了与任何现有代码隔离的代码,并且我重现了错误。看起来正在发生的事情是 JFrame 正在实例化并出现在桌面上,然后大约一秒钟后,一个 0(来自注释打印语句)被输出到控制台。
假设您使用 EDT 正确创建了 GUI,您可以在创建 splitPane 的 class 的构造函数中添加以下内容:
SwingUtilities.invokeLater(() ->
{
Dimension d = splitPane.getSize();
splitPane.setDividerLocation(d.width - 120);
});
这会将代码添加到 EDT。因此,在框架可见且拆分窗格已指定大小后,分隔线位置将被重置。
我对您的代码做了一些更改并创建了这个 GUI。
我使用 JFrame
而不是扩展 JFrame
。
我设置了 JSplitPane
的首选大小,而不是 JFrame
。通常,您更关心 JSplitPane
的大小而不是 JFrame
。通常,JSplitPane
将有两个带有 Swing 组件的 JPanels
,因此此时您不必指定首选大小。
这是完整的可运行代码。
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;
public class JSplitPaneRight {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new JSplitPaneRight();
});
}
public JSplitPaneRight() {
initComponents();
}
public void initComponents() {
JFrame frame = new JFrame("JSplitPane Right");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createSplitPane(), BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JSplitPane createSplitPane( ) {
JSplitPane splitpane = new JSplitPane();
splitpane.setPreferredSize(new Dimension(640, 480));
int width = splitpane.getPreferredSize().width;
System.out.println(width); // prints 0
splitpane.setDividerLocation(width - 120);
return splitpane;
}
}
据我所知,JSplitPane的setDivider()
方法可以接受一个int,它是从左边开始的绝对位置。例如,someSplitPane.setDivider(120);
会将分隔线设置为距左侧 120px。有什么方法可以做同样的事情,但将分隔线设置为从右边开始的绝对位置?
实现简单:
public class Window extends JFrame {
JSplitPane splitpane;
public Window() {
initComponents();
}
private void initComponents() {
setTitle("Debugging");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setMinimumSize(new Dimension(640, 480));
splitpane = new JSplitPane();
System.out.println(splitpane.getSize().width); // prints 0
splitpane.setDividerLocation(splitpane.getSize().width - 120);
getContentPane().add(splitpane);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new Window().setVisible(true);
});
}
}
编辑:我编写了与任何现有代码隔离的代码,并且我重现了错误。看起来正在发生的事情是 JFrame 正在实例化并出现在桌面上,然后大约一秒钟后,一个 0(来自注释打印语句)被输出到控制台。
假设您使用 EDT 正确创建了 GUI,您可以在创建 splitPane 的 class 的构造函数中添加以下内容:
SwingUtilities.invokeLater(() ->
{
Dimension d = splitPane.getSize();
splitPane.setDividerLocation(d.width - 120);
});
这会将代码添加到 EDT。因此,在框架可见且拆分窗格已指定大小后,分隔线位置将被重置。
我对您的代码做了一些更改并创建了这个 GUI。
我使用 JFrame
而不是扩展 JFrame
。
我设置了 JSplitPane
的首选大小,而不是 JFrame
。通常,您更关心 JSplitPane
的大小而不是 JFrame
。通常,JSplitPane
将有两个带有 Swing 组件的 JPanels
,因此此时您不必指定首选大小。
这是完整的可运行代码。
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;
public class JSplitPaneRight {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new JSplitPaneRight();
});
}
public JSplitPaneRight() {
initComponents();
}
public void initComponents() {
JFrame frame = new JFrame("JSplitPane Right");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createSplitPane(), BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JSplitPane createSplitPane( ) {
JSplitPane splitpane = new JSplitPane();
splitpane.setPreferredSize(new Dimension(640, 480));
int width = splitpane.getPreferredSize().width;
System.out.println(width); // prints 0
splitpane.setDividerLocation(width - 120);
return splitpane;
}
}