【问题标题】:Using two JPanels in one JFrame在一个 JFrame 中使用两个 JPanel
【发布时间】:2014-09-09 16:42:51
【问题描述】:

我正在尝试创建一个程序,该程序允许用户单击按钮以在JPanel 中放置一些东西,并允许他们移动这个项目。我已经找到了一个很好的布局来允许移动组件(请参阅this 链接)。但是,我只是好奇创建这样的布局的最佳方法?我希望有这样的东西:

我怎样才能做到这一点?我要使用两个JPanel 还是别的什么?

【问题讨论】:

  • 是什么在移动项目?

标签: java swing user-interface layout


【解决方案1】:

主面板(或窗口内容面板)必须有一个BorderLayout 作为布局管理器。

然后,按钮面板将添加到BorderLayout.WEST,拖动面板将添加到BorderLayout.CENTER。

有一个Visual Guide 可用于摆动布局管理器。

【讨论】:

    【解决方案2】:

    尝试使用JSplitPane:

    这是一个代码示例:

    class SplitPane extends JFrame {
    
    private     JSplitPane  splitPaneV;
    private     JSplitPane  splitPaneH;
    private     JPanel      panel1;
    private     JPanel      panel2;
    private     JPanel      panel3;
    
    
    public SplitPane(){
        setTitle( "Split Pane Application" );
        setBackground( Color.gray );
    
        JPanel topPanel = new JPanel();
        topPanel.setLayout( new BorderLayout() );
        getContentPane().add( topPanel );
    
        // Create the panels
        createPanel1();
        createPanel2();
        createPanel3();
    
        // Create a splitter pane
        splitPaneV = new JSplitPane( JSplitPane.VERTICAL_SPLIT );
        topPanel.add( splitPaneV, BorderLayout.CENTER );
    
        splitPaneH = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT );
        splitPaneH.setLeftComponent( panel1 );
        splitPaneH.setRightComponent( panel2 );
    
        splitPaneV.setLeftComponent( splitPaneH );
        splitPaneV.setRightComponent( panel3 );
    }
    
    public void createPanel1(){
        panel1 = new JPanel();
        panel1.setLayout( new BorderLayout() );
    
        // Add some buttons
        panel1.add( new JButton( "North" ), BorderLayout.NORTH );
        panel1.add( new JButton( "South" ), BorderLayout.SOUTH );
        panel1.add( new JButton( "East" ), BorderLayout.EAST );
        panel1.add( new JButton( "West" ), BorderLayout.WEST );
        panel1.add( new JButton( "Center" ), BorderLayout.CENTER );
    
    }
    
    public void createPanel2(){
        panel2 = new JPanel();
        panel2.setLayout( new FlowLayout() );
    
        panel2.add( new JButton( "Button 1" ) );
        panel2.add( new JButton( "Button 2" ) );
        panel2.add( new JButton( "Button 3" ) );
    }
    
    public void createPanel3(){
        panel3 = new JPanel();
        panel3.setLayout( new BorderLayout() );
        panel3.setPreferredSize( new Dimension( 400, 100 ) );
        panel3.setMinimumSize( new Dimension( 100, 50 ) );
    
        panel3.add( new JLabel( "Notes:" ), BorderLayout.NORTH );
        panel3.add( new JTextArea(), BorderLayout.CENTER );
    }
    
    public static void main( String args[] ){
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception evt) {}
        // Create an instance of the test application
        SplitPane mainFrame = new SplitPane();
        mainFrame.pack();
        mainFrame.setVisible( true );
    }
    }
    

    你可以玩splitPaneH.setOneTouchExpandable真/假

    您可以为两者配置分隔线位置,例如:

    Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension d = tk.getScreenSize();
        int width = d.width;
        int height = d.height;
    
        spane.setDividerLocation((width*3)/4);
        spanex.setDividerLocation(width/4); 
    

    【讨论】:

    • spane 在spane.setDividerLocation((width*3)/4); 中是什么?它不存在于整个代码中。顺便说一句,+1 很好的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2012-06-13
    • 1970-01-01
    • 2014-06-05
    • 2021-05-03
    • 2014-04-27
    • 1970-01-01
    相关资源
    最近更新 更多