14.5-全栈Java笔记:java.awt这些布局怎么写?|流式|边界|网格

本文介绍了Java.awt中的布局管理器,包括FlowLayout的自动换行排列,BorderLayout的五个区域分布,以及GridLayout的矩形网格布局。通过示例展示了不同布局在容器中控件的排列方式,帮助理解Java界面设计中的布局管理。

布局管理器

读者会发现,如果使用坐标定位法(空布局),在一个比较复杂的界面上定位每个控件的坐标是一个非常麻烦的工作,而且在界面大小发生改变时,控件的绝对位置也不会随之发生改变。那么如果我们想让用户界面上的组件可以按照不同的方式进行排列怎么办?例如:可以依序水平排列,或者按网格方式进行排列等,其实每种排列方案都是指组件的一种“布局”,要管理这些布局,就需要本节学习的布局管理器。
这里写图片描述

管理布局的类由java.awt包来提供,布局管理器是一组实现java.awt.LayoutManager接口的类,由这些类自动定位组件。一般使用布局管理器定义容器,如果容器使用了某种布局管理器后,那么放在其上的控件就按照相应的规则排列。我们接下来就介绍几种常用的布局管理器:流式布局(FlowLayout)、边界布局(BorderLayout)、网格布局(GridLayout)。如图1所示。

如上图所示:如果在一个容器中压入控件(该示例的控件用一组JButton代表),我们发现流式布局会将控件放在第一行,第一行满了自动放置在第二行,依次类推;而边界布局会把控件分布在容器的东、南、西、北、中的五个区域;最后网格布局会把容器中的控件按n行m列均匀分布。

注意:
1)一旦使用任何布局,那么控件的坐标定位将失效。
2)如果在使用流式布局的容器中压入JTextField控件,那么这个JTextField的构造方法请
3)使用传int参数的构造方法。

java.awt.FlowLayout
流布局用于安排有方向的控件,这非常类似于段落中的文本行。如表1所示,为FlowLayout类的构造方法。
这里写图片描述

注意:
JPanel的无参构造方法默认就是流式布局。

【示例1】流式布局

package cn.sxt.views.testlayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FlowLayoutDemo extends JFrame {
           private JPanel pnlMain;
           private JButton btn1;
           private JButton btn2;
           private JButton btn3;
           private JButton btn4;
           private JButton btn5;

           public FlowLayoutDemo() {
                     //该处代码也可以写成:pnlMain = new JPanel(new FlowLayout());
                     pnlMain = new JPanel();
                     btn1 = new JButton("按钮1");
                     btn2 = new JButton("按钮2");
                     btn3 = new JButton("按钮3");
                     btn4 = new JButton("按钮4");
                     btn5 = new JButton("按钮5");

                     init();
           }

           private void init() {
                     //设置窗口属性
                     this.setTitle("测试流式布局");
                     this.setSize(300, 200);
                     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                     //将控件添加到容器上
                     pnlMain.add(btn1);
                     pnlMain.add(btn2);
                     pnlMain.add(btn3);
                     pnlMain.add(btn4);
                     pnlMain.add(btn5);
                     //将容器添加到窗口上
                     this.add(pnlMain);
                     this.setVisible(true);
           }

           /**创建流式布局窗口*/
           public static void main(String[ ] args) {
                     new FlowLayoutDemo();
           }
}

执行结果如图所示:
这里写图片描述

java.awt. BorderLayout
布置容器的边界布局,它可以对容器上的控件进行安排,并调整其大小,使其符合下列五个区域:南、北、东、西和中间区域。 如表3所示,为BorderLayout类的构造方法。
这里写图片描述

注意
边界布局最多将容器分成5个区间,但是可以少,比如只有北、中、南,或是只有西、中、东,或是按照需求具体划分

【示例2】边界布局

package cn.sxt.views.testlayout;

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BorderLayoutDemo extends JFrame {
           private JPanel pnlMain;
           private JButton btnN;
           private JButton btnC;
           private JButton btnS;
           private JButton btnW;
           private JButton btnE;

           public BorderLayoutDemo() {
                     //将容器的布局设置为边界布局
                     pnlMain = new JPanel(new BorderLayout());
                     btnN = new JButton("按钮-北");
                     btnC = new JButton("按钮-中");
                     btnS = new JButton("按钮-南");
                     btnW = new JButton("按钮-西");
                     btnE = new JButton("按钮-东");

                     init();
           }

           private void init() {
                     //设置窗口属性
                     this.setTitle("测试边界布局");
                     this.setSize(300, 200);
                     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                     /*
                      * 注意在使用边界布局的容器时,压入控件要以第2参数说明控件放在哪个位置;
                      * 否则,如果没有第2参数,默认在中间区域
                       */
                     pnlMain.add(btnN,BorderLayout.NORTH);
                     pnlMain.add(btnC,BorderLayout.CENTER);
                     pnlMain.add(btnS,BorderLayout.SOUTH);
                     pnlMain.add(btnW,BorderLayout.WEST);
                     pnlMain.add(btnE,BorderLayout.EAST);
                     //将容器添加到窗口上
                     this.add(pnlMain);
                     this.setVisible(true);
           }

           /**创建边界布局窗口*/
           public static void main(String[ ] args) {
                     new BorderLayoutDemo();
           }
}

执行结果如图所示:
这里写图片描述

java.awt. GridLayout
网格布局它以矩形网格形式对容器的控件进行布置。容器被分成大小相等的矩形,一个矩形中放置一个控件。 如表5所示,为GridLayout类的构造方法。
这里写图片描述

注意:
使用网格布局时,如果控件的数量过多或过少时,网格布局会自动调整,但是行数不会变化,如:设置一个2行3列的网格,如果压入控件为7个,那么自动变为2行4列。
如果在一个容器中要压入12个按钮,按3行4列排列,如示例3所示。

【示例3】网格布局

package cn.sxt.views.testlayout;

import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GridLayoutDemo extends JFrame {
           private JPanel pnlMain;
           private JButton[ ] btnS;

           public GridLayoutDemo() {
                     //将容器的布局设置为网格布局,指定布局为3行4列
                     pnlMain = new JPanel(new GridLayout(3, 4));
                     btnS = new JButton[12];
                     for(int i = 0;i < btnS.length;i++) {
                                btnS[i] = new JButton("按钮"+(i+1));
                     }

                     init();
           }

           private void init() {
                     //设置窗口属性
                     this.setTitle("测试网格布局");
                     this.setSize(400, 200);
                     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                     //将控件添加到容器上
                     for(JButton btn : btnS) {
                                pnlMain.add(btn);
                     }
                     //将容器添加到窗口上
                     this.add(pnlMain);
                     this.setVisible(true);
           }
           /**创建网格布局窗口*/
           public static void main(String[ ] args) {
                     new GridLayoutDemo();
           }
}

执行结果如图所示:
这里写图片描述

「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。

笔记包含从浅入深的六大部分:
A-Java入门阶段
B-数据库从入门到精通
C-手刃移动前端和Web前端
D-J2EE从了解到实战
E-Java高级框架精解
F-Linux和Hadoop

[root@yfw ~]# cd /opt/openfire/enterprise/spark/Spark [root@yfw Spark]# # 推荐使用 openfire 用户身份运行(更安) [root@yfw Spark]# su - openfire -s /bin/bash ✅ JAVA_HOME: /usr/lib/jvm/java-11-openjdk ✅ Maven home: /opt/maven ✅ Java version: openjdk version "11.0.13" 2021-10-19 LTS [openfire@yfw ~]$ [openfire@yfw ~]$ # 切换到 Spark 目录 [openfire@yfw ~]$ cd /opt/openfire/enterprise/spark/Spark [openfire@yfw Spark]$ [openfire@yfw Spark]$ # 设置 DISPLAY 环境变量(通常为 :0) [openfire@yfw Spark]$ export DISPLAY=:0 [openfire@yfw Spark]$ [openfire@yfw Spark]$ # 启动 Spark [openfire@yfw Spark]$ ./Spark ./Spark: line 384: basename: command not found ./Spark: line 385: dirname: command not found ./Spark: line 400: dirname: command not found ./Spark: line 401: basename: command not found ./Spark: line 81: expr: command not found ./Spark: line 82: expr: command not found ./Spark: line 96: awk: command not found ./Spark: line 97: cp: command not found ./Spark: line 100: sed: command not found ./Spark: line 103: chmod: command not found ./Spark: line 172: expr: command not found ./Spark: line 172: [: -eq: unary operator expected ./Spark: line 172: expr: command not found ./Spark: line 172: [: -eq: unary operator expected ./Spark: line 172: expr: command not found ./Spark: line 172: [: -eq: unary operator expected ./Spark: line 172: expr: command not found ./Spark: line 172: [: -eq: unary operator expected ./Spark: line 172: expr: command not found ./Spark: line 172: [: -eq: unary operator expected Error: Could not find or load main class install4j.org.jivesoftware.launcher.Startup [openfire@yfw Spark]$ echo $PATH /usr/local/ffmpeg/bin:/opt/spark/bin:=en_US.UTF-8:/usr/local/ffmpeg/bin [openfire@yfw Spark]$ export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" [openfire@yfw Spark]$ ls /usr/bin | grep -E "(cp|sed|basename|dirname)" basename cp cpack cpack3 cpan cpan-mirrors cpio cpp cpupower dirname lscpu mcpp rpm2cpio scp sed sedismod sedispol tcptraceroute [openfire@yfw Spark]$ which cp # 应该输出 /usr/bin/cp /usr/bin/cp [openfire@yfw Spark]$ which sed # /usr/bin/sed /usr/bin/sed [openfire@yfw Spark]$ which java # 可能是 /usr/lib/jvm/java-11-openjdk/bin/java /usr/bin/java [openfire@yfw Spark]$ java -version # 查看 Java 版本 openjdk version "1.8.0_312" OpenJDK Runtime Environment (build 1.8.0_312-b07) OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode) [openfire@yfw Spark]$ ls /usr/lib/jvm/java-11-openjdk/ bin conf include legal lib release tapset [openfire@yfw Spark]$ /usr/lib/jvm/java-11-openjdk/bin/java -version openjdk version "11.0.13" 2021-10-19 LTS OpenJDK Runtime Environment 18.9 (build 11.0.13+8-LTS) OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8-LTS, mixed mode, sharing) [openfire@yfw Spark]$ export JAVA_HOME=/usr/lib/jvm/java-11-openjdk [openfire@yfw Spark]$ export PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin [openfire@yfw Spark]$ java -version openjdk version "11.0.13" 2021-10-19 LTS OpenJDK Runtime Environment 18.9 (build 11.0.13+8-LTS) OpenJDK 64-Bit Server VM 18.9 (build 11.0.13+8-LTS, mixed mode, sharing) [openfire@yfw Spark]$ cd /opt/openfire/enterprise/spark/Spark [openfire@yfw Spark]$ ./Spark java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.jivesoftware.launcher.Startup.start(Startup.java:75) at org.jivesoftware.launcher.Startup.main(Startup.java:31) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:84) at com.install4j.runtime.launcher.UnixLauncher.start(UnixLauncher.java:69) at install4j.org.jivesoftware.launcher.Startup.main(Unknown Source) Caused by: java.awt.AWTError: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable. at java.desktop/sun.awt.X11GraphicsEnvironment.initDisplay(Native Method) at java.desktop/sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:102) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.desktop/sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:61) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:315) at java.desktop/java.awt.GraphicsEnvironment$LocalGE.createGE(GraphicsEnvironment.java:101) at java.desktop/java.awt.GraphicsEnvironment$LocalGE.<clinit>(GraphicsEnvironment.java:83) at java.desktop/java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:129) at java.desktop/sun.awt.X11.XToolkit.<clinit>(XToolkit.java:231) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:315) at java.desktop/java.awt.Toolkit$2.run(Toolkit.java:588) at java.desktop/java.awt.Toolkit$2.run(Toolkit.java:583) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.desktop/java.awt.Toolkit.getDefaultToolkit(Toolkit.java:582) at java.desktop/sun.swing.SwingUtilities2.getSystemMnemonicKeyMask(SwingUtilities2.java:2212) at java.desktop/javax.swing.plaf.basic.BasicLookAndFeel.initComponentDefaults(BasicLookAndFeel.java:1096) at java.desktop/javax.swing.plaf.metal.MetalLookAndFeel.initComponentDefaults(MetalLookAndFeel.java:440) at java.desktop/javax.swing.plaf.basic.BasicLookAndFeel.getDefaults(BasicLookAndFeel.java:150) at java.desktop/javax.swing.plaf.metal.MetalLookAndFeel.getDefaults(MetalLookAndFeel.java:1560) at java.desktop/javax.swing.UIManager.setLookAndFeel(UIManager.java:587) at java.desktop/javax.swing.UIManager.setLookAndFeel(UIManager.java:629) at java.desktop/javax.swing.UIManager.initializeDefaultLAF(UIManager.java:1404) at java.desktop/javax.swing.UIManager.initialize(UIManager.java:1517) at java.desktop/javax.swing.UIManager.maybeInitialize(UIManager.java:1483) at java.desktop/javax.swing.UIManager.getInstalledLookAndFeels(UIManager.java:422) at java.desktop/javax.swing.UIManager.installLookAndFeel(UIManager.java:465) at java.desktop/javax.swing.UIManager.installLookAndFeel(UIManager.java:484) at org.jivesoftware.spark.ui.themes.LookAndFeelManager.<clinit>(LookAndFeelManager.java:40) at org.jivesoftware.Spark.startup(Spark.java:163) ... 13 more [openfire@yfw Spark]$ xhost +si:localuser:openfire xhost: unable to open display ":0" [openfire@yfw Spark]$ export JAVA_HOME=/usr/lib/jvm/java-11-openjdk [openfire@yfw Spark]$ export PATH=$JAVA_HOME/bin:$PATH [openfire@yfw Spark]$ [openfire@yfw Spark]$ cd /opt/openfire/enterprise/spark/Spark [openfire@yfw Spark]$ [openfire@yfw Spark]$ java \ > -Djava.awt.headless=true \ > -cp "lib/*" \ > org.jivesoftware.launcher.Startup Warning: no working directory set. This might cause updated data to be missed. Please set a system property 'appdir' to the location where Spark is installed to correct this. java.lang.reflect.InvocationTargetException at java.desktop/java.awt.EventQueue.invokeAndWait(EventQueue.java:1367) at java.desktop/java.awt.EventQueue.invokeAndWait(EventQueue.java:1342) at org.jivesoftware.Spark.startup(Spark.java:186) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.jivesoftware.launcher.Startup.start(Startup.java:75) at org.jivesoftware.launcher.Startup.main(Startup.java:31) Caused by: java.awt.HeadlessException at java.desktop/java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:208) at java.desktop/java.awt.Window.<init>(Window.java:548) at java.desktop/java.awt.Frame.<init>(Frame.java:423) at java.desktop/java.awt.Frame.<init>(Frame.java:388) at java.desktop/javax.swing.JFrame.<init>(JFrame.java:180) at org.jivesoftware.Spark.lambda$startup$0(Spark.java:188) at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:303) at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721) at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740) at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90) [openfire@yfw Spark]$ sudo yum install xorg-x11-server-Xvfb -y We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for openfire: Sorry, try again. [sudo] password for openfire: Sorry, try again. [sudo] password for openfire: sudo: 3 incorrect password attempts [openfire@yfw Spark]$ exit logout 连接已断开,按回车将尝试重新连接! 正在尝试重新连接! Welcome to Huawei Cloud Service Last login: Thu Oct 30 08:07:10 2025 from 127.0.0.1 ✅ JAVA_HOME: /usr/lib/jvm/java-11-openjdk ✅ Maven home: /opt/maven ✅ Java version: openjdk version "11.0.13" 2021-10-19 LTS [root@yfw ~]# yum install xorg-x11-server-Xvfb -y Failed to set locale, defaulting to C.UTF-8 Last metadata expiration check: 0:41:08 ago on Thu Oct 30 07:39:51 2025. Dependencies resolved. ==================================================================================================== Package Architecture Version Repository Size ==================================================================================================== Installing: xorg-x11-server-Xvfb x86_64 1.20.11-2.el8 AppStream 871 k Installing dependencies: libXdmcp x86_64 1.1.3-1.el8 AppStream 41 k libXfont2 x86_64 2.0.3-2.el8 AppStream 149 k libxkbfile x86_64 1.1.0-1.el8 AppStream 88 k xorg-x11-server-common x86_64 1.20.11-2.el8 AppStream 42 k xorg-x11-xauth x86_64 1:1.0.9-12.el8 AppStream 39 k xorg-x11-xkb-utils x86_64 7.7-28.el8 AppStream 114 k Transaction Summary ==================================================================================================== Install 7 Packages Total download size: 1.3 M Installed size: 3.0 M Downloading Packages: (1/7): libXfont2-2.0.3-2.el8.x86_64.rpm 4.0 MB/s | 149 kB 00:00 (2/7): libXdmcp-1.1.3-1.el8.x86_64.rpm 1.0 MB/s | 41 kB 00:00 (3/7): libxkbfile-1.1.0-1.el8.x86_64.rpm 1.5 MB/s | 88 kB 00:00 (4/7): xorg-x11-server-common-1.20.11-2.el8.x86_64.rpm 1.1 MB/s | 42 kB 00:00 (5/7): xorg-x11-server-Xvfb-1.20.11-2.el8.x86_64.rpm 16 MB/s | 871 kB 00:00 (6/7): xorg-x11-xauth-1.0.9-12.el8.x86_64.rpm 1.0 MB/s | 39 kB 00:00 (7/7): xorg-x11-xkb-utils-7.7-28.el8.x86_64.rpm 4.3 MB/s | 114 kB 00:00 ---------------------------------------------------------------------------------------------------- Total 12 MB/s | 1.3 MB 00:00 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : xorg-x11-xauth-1:1.0.9-12.el8.x86_64 1/7 Error unpacking rpm package xorg-x11-xauth-1:1.0.9-12.el8.x86_64 Installing : libxkbfile-1.1.0-1.el8.x86_64 2/7 error: unpacking of archive failed on file /usr/bin/xauth;6902af6d: cpio: open error: xorg-x11-xauth-1:1.0.9-12.el8.x86_64: install failed Installing : xorg-x11-xkb-utils-7.7-28.el8.x86_64 3/7 Error unpacking rpm package xorg-x11-xkb-utils-7.7-28.el8.x86_64 Installing : xorg-x11-server-common-1.20.11-2.el8.x86_64 4/7 error: unpacking of archive failed on file /usr/bin/setxkbmap;6902af6d: cpio: open error: xorg-x11-xkb-utils-7.7-28.el8.x86_64: install failed Installing : libXfont2-2.0.3-2.el8.x86_64 5/7 Installing : libXdmcp-1.1.3-1.el8.x86_64 6/7 Installing : xorg-x11-server-Xvfb-1.20.11-2.el8.x86_64 7/7 Error unpacking rpm package xorg-x11-server-Xvfb-1.20.11-2.el8.x86_64 Running scriptlet: xorg-x11-server-Xvfb-1.20.11-2.el8.x86_64 7/7 error: unpacking of archive failed on file /usr/bin/Xvfb;6902af6d: cpio: open error: xorg-x11-server-Xvfb-1.20.11-2.el8.x86_64: install failed Verifying : libXdmcp-1.1.3-1.el8.x86_64 1/7 Verifying : libXfont2-2.0.3-2.el8.x86_64 2/7 Verifying : libxkbfile-1.1.0-1.el8.x86_64 3/7 Verifying : xorg-x11-server-Xvfb-1.20.11-2.el8.x86_64 4/7 Verifying : xorg-x11-server-common-1.20.11-2.el8.x86_64 5/7 Verifying : xorg-x11-xauth-1:1.0.9-12.el8.x86_64 6/7 Verifying : xorg-x11-xkb-utils-7.7-28.el8.x86_64 7/7 Installed: libXdmcp-1.1.3-1.el8.x86_64 libXfont2-2.0.3-2.el8.x86_64 libxkbfile-1.1.0-1.el8.x86_64 xorg-x11-server-common-1.20.11-2.el8.x86_64 Failed: xorg-x11-server-Xvfb-1.20.11-2.el8.x86_64 xorg-x11-xauth-1:1.0.9-12.el8.x86_64 xorg-x11-xkb-utils-7.7-28.el8.x86_64 Error: Transaction failed [root@yfw ~]# Xvfb -help -bash: Xvfb: command not found [root@yfw ~]#
最新发布
10-31
你已经非常接近成功,但卡在了一个关键问题上: > ❌ `yum install xorg-x11-server-Xvfb -y` **安装失败**,因为 RPM 包解压时出错: ``` error: unpacking of archive failed on file /usr/bin/Xvfb; cpio: open ``` 这意味着:**系统无法将文件入 `/usr/bin/` 目录(权限或磁盘只读)** --- ## ✅ 问题诊断:为什么安装失败? 从错误信息来看: ``` cpio: open error: unpacking of archive failed on file /usr/bin/Xvfb ``` 常见原因有以下几种: | 原因 | 检查方式 | |------|---------| | 🔴 磁盘满了 | `df -h` | | 🔴 文件系统只读 | `mount | grep $(df / --output=source)` | | 🔴 `/usr/bin` 目录权限被破坏 | `ls -ld /usr/bin` | | 🔴 SELinux 或安策略阻止| `dmesg \| grep denied` | --- ## 🛠️ 解决方案一:检查并修复文件系统状态 ### 步骤 1:检查磁盘使用情况 ```bash df -h / ``` 输出示例: ``` Filesystem Size Used Avail Use% Mounted on /dev/vda1 40G 39G 0 100% / ``` 👉 如果 `Avail` 是 `0`,说明磁盘已满 → 需要清理。 #### 清理建议: ```bash # 删除缓存 rm -rf /var/cache/yum/* rm -rf /root/.cache/* # 查看大文件 du -sh /* 2>/dev/null | sort -hr | head -10 ``` --- ### 步骤 2:检查是否文件系统为只读 ```bash mount | grep " $(df / --output=target) " ``` 输出类似: ``` /dev/vda1 on / type ext4 (rw,relatime) ``` ✅ 正常应显示 `rw`(读) ❌ 若是 `ro`(只读),则说明文件系统异常! #### 如何修复只读文件系统? 需要重启进入维护模式或联系云服务商修复。临时尝试 remount: ```bash mount -o remount,rw / ``` 如果报错: ``` mount: / is busy or read-only ``` 说明底层有问题(如虚拟机镜像损坏、云盘脱机等)。 --- ### 步骤 3:检查 `/usr/bin` 权限 ```bash ls -ld /usr/bin ``` 正确输出应该是: ``` drwxr-xr-x 2 root root ... ``` 如果你看到: ``` d-wx--x--x 2 root root ... # 权限异常 ``` 说明权限被改了!修复命令: ```bash chmod 755 /usr/bin ``` --- ## 🧰 替代方案二:手动下载并安装 Xvfb(绕过 yum) 如果 `yum` 安装一直失败,我们可以手动下载 `.rpm` 包并用 `rpm` 命令安装。 ### 步骤 1:下载 `xorg-x11-server-Xvfb` RPM 包 前往 [pkgs.org](https://pkgs.org/) 搜索: > `xorg-x11-server-Xvfb el8 x86_64` 找到可用链接,例如: ```bash wget https://vault.centos.org/8.5.2111/AppStream/x86_64/os/Packages/xorg-x11-server-Xvfb-1.20.11-2.el8.x86_64.rpm ``` > ⚠️ 注意你的系统是 EL8(RHEL 8 / CentOS 8 / AlmaLinux 8) ### 步骤 2:强制安装 RPM(忽略错误) ```bash rpm -ivh --force --nodeps xorg-x11-server-Xvfb-1.20.11-2.el8.x86_64.rpm ``` 参数说明: - `--force`:强制覆盖 - `--nodeps`:忽略依赖 ⚠️ 虽然跳过依赖不推荐,但在调试环境中可接受。 ### 步骤 3:验证是否安装成功 ```bash which Xvfb # 应该输出:/usr/bin/Xvfb Xvfb -help ``` --- ## ✅ 成功后:启动 Xvfb + Spark ```bash su - openfire -s /bin/bash # 设置环境 export JAVA_HOME=/usr/lib/jvm/java-11-openjdk export PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 启动虚拟显示 :99 Xvfb :99 -screen 0 1024x768x24 -nolisten tcp & export DISPLAY=:99 # 进入 Spark 目录并启动 cd /opt/openfire/enterprise/spark/Spark ./Spark ``` 🎯 此时你应该不再看到 `AWTError: Can't connect to X11` 错误! --- ## 💡 提示:如何确认 Spark 是否运行? ```bash ps aux | grep java ``` 你会看到类似进程: ``` openfire ... java ... org.jivesoftware.launcher.Startup ``` 也可以查看日志: ```bash ls ~/.spark/logs/ tail -f ~/.spark/logs/spark*.log ``` --- ## 📋 总结:你现在应该怎么做? | 步骤 | 命令 | |------|------| | 1. 检查磁盘空间 | `df -h /` | | 2. 检查挂载状态 | `mount \| grep " $(df / --output=target) "` | | 3. 尝试重新挂载为读 | `mount -o remount,rw /` | | 4. 手动下载 RPM | `wget https://.../xorg-x11-server-Xvfb-1.20.11-2.el8.x86_64.rpm` | | 5. 强制安装 | `rpm -ivh --force --nodeps *.rpm` | | 6. 切换用户运行 | `su - openfire` | | 7. 启动 Xvfb | `Xvfb :99 -screen 0 1024x768x24 &` | | 8. 设置 DISPLAY | `export DISPLAY=:99` | | 9. 启动 Spark | `cd /opt/openfire/enterprise/spark/Spark && ./Spark` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值