簡體   English   中英

從右側設置 JSplitPane 分隔線位置

[英]Set JSplitPane divider location from the right

據我所知,JSplitPane 的setDivider()方法可以采用一個 int,它是從左側算起的絕對值 position。 例如someSplitPane.setDivider(120); 將從左側設置分隔線 120px。 有什么辦法我可以做同樣的事情,但從右邊將分隔線設置為絕對 position?

簡單的實現:

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(來自評論的打印語句)是 output 到控制台。

假設您使用 EDT 正確創建了 GUI,您可以在您創建 splitPane 的 class 的構造函數中添加以下內容:

SwingUtilities.invokeLater(() ->
{
        Dimension d = splitPane.getSize();
        splitPane.setDividerLocation(d.width - 120);
});

這會將代碼添加到 EDT。 因此,在框架可見並且已為拆分窗格指定大小后,將重置分隔線位置。

我對您的代碼進行了一些更改並創建了這個 GUI。

JSplitPane 右

我使用了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;
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM