将 JLabels 置于 JPanel 中心

2023-12-08

我正在制作一个记分程序,但遇到了问题。我试图做的是在顶部有一个 JPanel,其中包含两个 JPanel,而 JPanel 又包含两个团队名称。我很困惑为什么程序顶部的两个 JLabel 没有位于它们所包含的 JPanel 内部的中心。

enter image description here

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class ScoreFrame extends JFrame {

    private static final Dimension SCREEN_SIZE = Toolkit.getDefaultToolkit().getScreenSize();
    private static final int WIDTH = SCREEN_SIZE.width;
    private static final int HEIGHT = SCREEN_SIZE.height;
    private final JTextField[] nameField = new JTextField[] { new JTextField(), new JTextField() };
    private final JLabel[] nameLabel = new JLabel[] { new JLabel("Team 1"), new JLabel("Team 2") };
    private final GridBagLayout gridBag = new GridBagLayout();
    private final GridBagConstraints constraints = new GridBagConstraints();
    private final JPanel topPanel = new JPanel();

    public ScoreFrame() {
    super();
    setResizable(false);
    setSize(SCREEN_SIZE);
    setLayout(gridBag);
    setUndecorated(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addKeyListener(new EscapeListener());
    addComponents();
    }

    private void addComponents() {
    addToTopPanel();
    constraints.insets = new Insets(0, 0, (int) (HEIGHT * (double) 4 / 5), 0);
    gridBag.setConstraints(topPanel, constraints);

    add(topPanel);
    }

    private void addToTopPanel() {
    final JPanel[] teamPanel = new JPanel[] { new JPanel(), new JPanel() };
    topPanel.setLayout(gridBag);
    topPanel.setSize(new Dimension(WIDTH, HEIGHT / 5));

    Dimension teamPanelSize = new Dimension(WIDTH / 2, HEIGHT / 5);
    teamPanel[0].setSize(teamPanelSize);
    teamPanel[1].setSize(teamPanelSize);

    Font nameFont = new Font("Times New Roman", Font.PLAIN, 50);
    nameLabel[0].setFont(nameFont);
    nameLabel[1].setFont(nameFont);

    teamPanel[0].add(nameLabel[0]);
    teamPanel[1].add(nameLabel[1]);

    gridBag.setConstraints(teamPanel[0], constraints);

    constraints.gridx = 1;
    gridBag.setConstraints(teamPanel[1], constraints);

    topPanel.add(teamPanel[0]);
    topPanel.add(teamPanel[1]);
    }

    public void paint(Graphics g) {
    super.paint(g);
    int strokeSize = ((WIDTH + HEIGHT) / 2) / 300;
    if (strokeSize < 1) {
        strokeSize = 1;
    }

    final int fontSize = (int) (strokeSize * 12.5);

    Graphics2D g2d = (Graphics2D) g;
    g2d.setStroke(new BasicStroke(strokeSize));
    g.drawLine(WIDTH / 2, 0, WIDTH / 2, HEIGHT / 5);
    g.drawLine(WIDTH / 2, (int) (HEIGHT * (double) 105 / 400), WIDTH / 2, HEIGHT);
    g.drawLine(0, HEIGHT / 5, WIDTH, HEIGHT / 5);
    g.drawRect((int) (WIDTH * (double) 45 / 100), HEIGHT / 5, WIDTH / 10, (int) (HEIGHT * (double) 3 / 20));

    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    g.setFont(new Font("Times New Roman", Font.PLAIN, fontSize));
    g.drawString("Errors", (int) (WIDTH * (double) 101 / 220), HEIGHT / 4);
    }

    private JFrame getFrame() {
    return this;
    }

    public static void main(final String args[]) {
    new ScoreFrame().setVisible(true);
    }

    public class EscapeListener implements KeyListener {

    public void keyPressed(final KeyEvent event) {
        if (event.getKeyCode() == 27) {
        final int choice = JOptionPane.showConfirmDialog(getFrame(), "Do you want to exit the program?");

        if (choice == 0) {
            System.exit(0);
        }
        }
    }

    public void keyReleased(final KeyEvent event) {
    }

    public void keyTyped(final KeyEvent event) {
    }
    }
}

调用pack()是使用布局的关键一步。本示例使用JLabel.CENTER and GridLayout在调整框架大小时使标签均匀居中。为简单起见,中心面板只是一个占位符。这个有点复杂example使用类似的方法以及java.text.MessageFormat.

附录:但我该如何申请 pack() 我的代码?

只需调用pack()如所引用的例子所示。我看不出有什么简单的方法可以挽救您目前从外部设置尺寸的方法。相反,覆盖getPreferredSize() in a JPanel为您的主要内容。无论屏幕尺寸如何,您的实现paintComponent()应适应当前大小,对于example.

image

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/** @see https://stackoverflow.com/a/14422016/230513 */
public class Scores {

    private final JLabel[] nameLabel = new JLabel[]{
        new JLabel("Team 1", JLabel.CENTER),
        new JLabel("Team 2", JLabel.CENTER)};

    private void display() {
        JFrame f = new JFrame("Scores");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel teamPanel = new JPanel(new GridLayout(1, 0));
        teamPanel.add(nameLabel[0]);
        teamPanel.add(nameLabel[1]);
        f.add(teamPanel, BorderLayout.NORTH);
        f.add(new JPanel() {

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(320, 240);
            }
        }, BorderLayout.CENTER);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Scores().display();
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 JLabels 置于 JPanel 中心 的相关文章

  • 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

    我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean 使用 NetBeans IDE 8 0 1 我在这个表中遇到了一个字段 其类型为 无符号 TINYINT 3 我发现可以执行以下操作将列的类型定义为 unsign
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • Spring RestTemplate 使用 cookie 遵循重定向

    最近我遇到了一个问题 我需要做一个GET请求远程服务 我假设使用一个简单的 servlet 并且 RestTemplate 返回Too many redirects 经过一番调查 似乎对指定远程服务发出的第一个请求实际上只是一个 302 重
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio

随机推荐

  • CakePHP 2.0 和移动应用程序身份验证

    我这里快要疯了 我正在用 CakePHP 制作一个网站 它将构成移动应用程序的后端 它不是一个移动网站 它纯粹是为了用于智能手机应用程序而设计的 That being said The application needs the user
  • 如何定位记录类的属性?

    定义记录类时 如何将属性定位到参数 字段或属性 例如 我想使用JsonIgnore但这不会编译 因为它对字段或属性有属性使用限制 record Person string FirstName string LastName JsonIgno
  • 当应用程序有超过 2 个表单时如何关闭整个应用程序而不多次显示消息框

    我正在使用 Windows 窗体开发一个应用程序 该项目包含 3 个表单 一个登录表单是主表单 另外两个表单是登录表单的子表单 我的问题是当想要通过使用关闭整个应用程序时Application Exit 在表单关闭事件中 我的消息框多次显示
  • FileShare.None 是否使线程等待文件流关闭?

    当使用文件流时 并设置FileShare to None 并假设同时访问同一功能的两个用户想要读 写该文件 将要FileShare None让第二个用户请求等待还是第二个用户的请求会抛出异常 two users get to this th
  • 通过 .htaccess 将 URL 重定向到自定义 URL

    我有一个页面 www mypage com 我想将特定 URL 重定向到另一个不存在的 URL 例如 我想要www mypage com about重定向到www mypage com about company php 其中 about
  • Android 应用内购买“您请求的商品无法购买”错误

    我正在研究应用内计费 从最近几天开始 我就陷入了困境 我已经为我的应用程序创建了产品列表 该列表在市场上保存为草稿 但是当我在设备上运行我的应用程序时 它给我一个错误 您请求的项目无法购买 有人可以帮我解决这个问题吗 这可能是因为开发者无法
  • 我可以在运行 MVC3 应用程序的情况下对 .NET 4 进行 bin 部署和 MVC4 吗?

    我在共享托管服务器上有一个 MVC3 应用程序 想通过创建一个新的 MVC4 项目并复制我的内容来升级该项目 当我发布 MVC4 应用程序的文件系统时 是否会发布所需的依赖项 或者服务器上是否有 GAC 等要求 我将使用 NET 4 我已经
  • 当点击 HTTPS 时 file_get_contents() 返回“无法打开流”

    当我在 HTTPS URL 上调用 file get contents 时 它返回 无法打开流 Warning file get contents https google com function file get contents fa
  • 在 Objective C 中使用 ivars 与 Properties 的原因

    我一直无法找到有关此主题的任何信息 并且我所了解的大部分信息完全是偶然的 并且花了几个小时试图找出我的代码无法正常工作的原因 在学习 Objective C 的大多数教程时 我发现变量和属性具有相同的名称 我不明白其重要性 因为似乎该属性完
  • Devise 无法在 Google Chrome 中登录

    我正在使用 Devise gem 在 Ruby on Rails Web 应用程序中进行用户身份验证 该过程非常简单 但是 添加 Nginx 和 ssl 证书后 该应用程序可以在 Mozilla Firefox 中登录 但无法在 Googl
  • jQuery Datepicker - 根据它出现的位置添加类

    我需要在输入元素中添加一个 上方 或 下方 类 具体取决于日期选择器在哪一侧打开 我似乎无法弄清楚如何获取即将创建的日期选择器实例的位置 也许我只是想错了 order main datepicker datepicker showOn bo
  • @font-face 自定义图标字体仅显示 unicodes

    我正在使用 CSS3 的 font face 自定义图标字体 并且在旧版本的 Google Chrome 中 仅显示 unicode 并且不会在我的自定义字体中替换或呈现 该字体显示这些 un icode 的字形 这是我正在使用的 font
  • “使用命名空间 std;”没有任何#include? [复制]

    这个问题在这里已经有答案了 我尝试遵循 它工作没有问题 但在这种情况下 std 没有定义 using namespace std int main 你的代码是非法的 指示using只能提名先前声明的命名空间 即可以通过名称查找找到名称的命名
  • 删除 div 时的 Bootstrap 网格布局

    因此 我正在使用一个仪表板外观 它可能有四个可以打开的 方块 并且角色取决于用户角色 顶行通常保留原样 因此其宽度约为 30 另一行的宽度约为 70 这可以 但是 在仪表板的底行 您可以有两个正方形 当这两个都打开时 我当前的网格设置工作得
  • 过滤对象中的多个值

    我需要按多个值过滤对象 对象示例 items url https id 1693 type ABC currencyCode SEK longName Abc name ABC micCode DEF listingDate 2018 05
  • 使用 numpy 进行数组重新分类

    我有一个包含 10 位数字的大型 50000 x 50000 64 位整数 NumPy 数组 数组中大约有 250 000 个唯一数字 我有第二个重新分类表 它将第一个数组中的每个唯一值映射到 1 到 100 之间的整数 我希望将第一个数组
  • 无法从 Orchard 模块中的项目文件夹加载图像

    我正在尝试在 Orchard 模块中插入图像 但遇到了一些问题 img src Href Modules Orchard Slider Content img other jpg gt 在我看来 我写了这个 但是图像没有加载 它说找不到资源
  • 如何修复 jslint The '&&' subexpression should bewrapped in parens 错误

    我将所有内容都放在括号中 但下面的代码仍然在 jslint 中抛出错误 Problem at line 5 character 104 The subexpression should be wrapped in parens if typ
  • .htaccess 导致所有页面被下载

    我添加了以下行 htaccess AddType application x httpd php html htm 当我尝试加载侧面的任何页面时 我的浏览器会尝试下载该页面 我究竟做错了什么 Thanks 最有可能的 您没有为您的网络服务器
  • 将 JLabels 置于 JPanel 中心

    我正在制作一个记分程序 但遇到了问题 我试图做的是在顶部有一个 JPanel 其中包含两个 JPanel 而 JPanel 又包含两个团队名称 我很困惑为什么程序顶部的两个 JLabel 没有位于它们所包含的 JPanel 内部的中心 im