【问题标题】:How to setting setBorder for window application?如何为窗口应用程序设置 setBorder?
【发布时间】:2019-12-27 11:33:19
【问题描述】:

我尝试创建一些用于监控网络的应用程序。我将创建 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


    【解决方案1】:
    insert_panel_0.setPreferredSize( new Dimension(width/4, (int) Math.round( hight*0.05)));
    

    问题在于您的宽度计算。当您除以 4 时,每个黑色子面板的宽度就是整个父面板的宽度。这会导致两个问题:

    1. 子面板无法适应具有 20 像素边框的父面板,因此在面板边缘进行绘制
    2. FlowLayout 然后会自动将第二个面板换行到下一行。所以面板显示在两行。

    解决方案是改进宽度计算,例如:

    insert_panel_0.setPreferredSize( new Dimension(width/12, (int) Math.round( hight*0.05)));
    

    现在两个面板将出现在同一行。

    如果您想要两个黑色面板之间有间隙,那么您还需要:

    //panel_2.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
    panel_2.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 0));
    

    【讨论】:

      【解决方案2】:

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

      希望对你有帮助。

      【讨论】:

      • 还是不行。我没有水平间隙
      • 此外,GridLayou 单元格大小相同。这不适合我的情况。
      • 在 GridLayout 中,每个单元格的大小完全相同。
      • 并尝试设置框架的内容窗格,如frame.getContentPane().setLayout
      • @Zero12 另外,GridLayou 单元格大小是相同的 - 好吧,你的问题不是关于这个。我们无法读懂你的想法来猜测你想要什么。这个问题应该已经在原问题中说明了。
      【解决方案3】:

      您可以使用 GridBagLayout 并利用 Insets。然而这带来了一个新问题:

      在计算 insert_panel_0insert_panel_1 的 Dimension 时,您需要考虑插入的大小,因为如果总大小(insert_panel_0_size + insert_panel_1_size + Insets em>) 大于父级 (panel_2_size),insert_panel_0insert_panel_1 将无法正确调整大小。

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

      Insets(int top, int left, int bottom, int right) 使用指定的顶部、左侧、底部创建并初始化一个新的 Insets 对象, 和右插图。

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

      您修改后的代码(您将不得不使用您的维度公式,我将其注释掉是因为:懒惰):

      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);
          }
      }
      

      【讨论】:

      • @Zero12 如果问题已关闭,请接受答案 - 感谢您发布可读、可运行的代码。 :~p
      猜你喜欢
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 2010-09-11
      • 2021-11-12
      相关资源
      最近更新 更多