如何为窗口应用程序设置setBorder?

问题描述 投票:1回答:2

我尝试创建一些用于监视网络的应用程序。我将创建4 JPanels并插入面板insert_panel_0insert_panel_2panel_2。我无法在insert_panel_0insert_panel_2之间设置边框。我有垂直缝隙,但没有水平缝隙。

您能帮我解决吗?

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class setting {

    public static void main(String[] args) {

        //get size window
        Dimension tk = Toolkit.getDefaultToolkit().getScreenSize();

        int  width = (int) tk.width;
        int  hight = (int) tk.height;



        JFrame frame = new JFrame(); 
        frame.setLayout(new GridLayout(1,4, 0, 0));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setBackground(Color.black);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 



        // set panels for window
        JPanel panel_0 = new JPanel();
        panel_0.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        panel_0.setBorder(new EmptyBorder(20, 20,20, 20));
        panel_0.setBackground(Color.white);
        frame.add(panel_0);



        JPanel panel_1 = new JPanel();
        panel_1.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        panel_1.setBackground(Color.yellow);
        panel_1.setBorder(new EmptyBorder(20, 20,20, 20));      
        frame.add(panel_1);

        JPanel panel_2 = new JPanel();
        panel_2.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        panel_2.setBorder(new EmptyBorder(20, 20,20, 20));      
        panel_2.setBackground(Color.green);
        frame.add(panel_2);


        JPanel panel_3 = new JPanel();
        panel_3.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        panel_3.setBorder(new EmptyBorder(20, 20,20, 20));      
        panel_3.setBackground(Color.blue);

        frame.add(panel_3);

        JPanel insert_panel_0 = new JPanel();
        insert_panel_0.setPreferredSize( new Dimension(width/4, (int) Math.round( hight*0.05)));
        insert_panel_0.setBackground(Color.black);
        panel_2.add(insert_panel_0);

        JPanel insert_panel_1 = new JPanel();
        insert_panel_1.setPreferredSize( new Dimension(width/4, (int) Math.round( hight*0.05)));
        insert_panel_1.setBackground(Color.black);
        panel_2.add(insert_panel_1);    

        frame.setVisible(true);
    }

}
java swing user-interface jframe jpanel
2个回答
0
投票

GridLayout具有设置水平和垂直间隙的方法:setHgap(hgap)setVGap(vgap)。或者,您可以在构造函数中创建布局时提供它们:new GridLayout(rows, cols, hgap, vgap)

希望有帮助。


0
投票

您可以使用GridBagLayout并使用Insets。但是,这带来了一个新问题:

[您需要考虑]在计算insert_panel_0insert_panel_1的尺寸时的插入物尺寸,因为如果总尺寸(insert_panel_0_size + insert_panel_1_size +插入物)大于父级(panel_2_size),insert_panel_0insert_panel_1的大小将不合适。

构造函数和描述:(来自java-docs):

Insets(int top, int left, int bottom, int right)用指定的上,左,下,和右插图。

与您的问题无关,但是在Java GUI中,您应该始终从事件调度线程中调用GUI。当您开始在GUI中获取更复杂/动态更新的值时,这将帮助您避免不必要的行为。

您修改后的代码(您必须使用Dimension公式,我将其注释掉是因为:懒惰:]]

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class Test {

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createGUI();
            }
        });
    }

    public static void createGUI() {

        //get size window
        Dimension tk = Toolkit.getDefaultToolkit().getScreenSize();

        int  width = (int) tk.width;
        int  hight = (int) tk.height;



        JFrame frame = new JFrame(); 
        frame.setLayout(new GridLayout(1,4, 0, 0));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setBackground(Color.black);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 



        // set panels for window
        JPanel panel_0 = new JPanel();
        panel_0.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        panel_0.setBorder(new EmptyBorder(20, 20,20, 20));
        panel_0.setBackground(Color.white);
        frame.add(panel_0);



        JPanel panel_1 = new JPanel();
        panel_1.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        panel_1.setBackground(Color.yellow);
        panel_1.setBorder(new EmptyBorder(20, 20,20, 20));      
        frame.add(panel_1);

        JPanel panel_2 = new JPanel();
        panel_2.setLayout(new GridBagLayout());
        panel_2.setBorder(new EmptyBorder(20, 20,20, 20));      
        panel_2.setBackground(Color.green);
        frame.add(panel_2);


        JPanel panel_3 = new JPanel();
        panel_3.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        panel_3.setBorder(new EmptyBorder(20, 20,20, 20));      
        panel_3.setBackground(Color.blue);

        frame.add(panel_3);

        GridBagConstraints gbc = new GridBagConstraints();

        gbc.insets = new Insets(0,5,0,5); // Horizontal padding only

        JPanel insert_panel_0 = new JPanel();
        //insert_panel_0.setPreferredSize( new Dimension((width/4), (int) Math.round( hight*0.05)));
        insert_panel_0.setPreferredSize(new Dimension(200, 100));
        insert_panel_0.setBackground(Color.black);

        gbc.gridx = 0;
        gbc.gridy = 0;
        panel_2.add(insert_panel_0, gbc);

        JPanel insert_panel_1 = new JPanel();
        //insert_panel_1.setPreferredSize( new Dimension(width/4 - 10, (int) Math.round( hight*0.05)));
        insert_panel_1.setPreferredSize(new Dimension(200, 100));
        insert_panel_1.setBackground(Color.black);

        gbc.gridx = 1;
        gbc.gridy = 0;
        panel_2.add(insert_panel_1, gbc);    

        frame.setVisible(true);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.