将 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 中心 的相关文章

  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • 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