如何在 NetBeans 中控制 JButton HTML 文本的居中?

Posted

技术标签:

【中文标题】如何在 NetBeans 中控制 JButton HTML 文本的居中?【英文标题】:How do I control the centering of JButton HTML text in NetBeans? 【发布时间】:2011-10-21 05:43:35 【问题描述】:

我正在尝试在 JButton 上放置两行文本;例如

+----------+
|  READER  |
|   STOP   |
+----------+

但我无法将其置于按钮的中心。我转到 JButton 的属性编辑器,并为 text 属性输入<html><center>READER<br>STOP。这会导致两个单词相对于彼此居中,但它们一起看起来仍然向按钮正面的右侧移动,如下所示:

+----------+
|    READER|
|     STOP |
+----------+

还有Horizo​​ntal & Vertical Alignment & Text Position 属性,我都设置为CENTER,但这没有任何效果,我看不到。

编辑:这是我完全省略 <center> 时的布局说明,以防有人对我的描述感到困惑,即“READER 和 STOP 是左对齐的,相互尊重,但右-在按钮上对齐”:

+----------+
|    READER|
|    STOP  |
+----------+

编辑:这是 NetBeans 生成的代码:

    readerStopButton_.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.light"));
    readerStopButton_.setFont(new java.awt.Font("Geneva", 0, 12)); // NOI18N
    readerStopButton_.setText("<html><center>READER<br>STOP</center></html>\n");
    readerStopButton_.setToolTipText("<html><b>Stop</b> button is currently inactive.  ");
    readerStopButton_.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
    readerStopButton_.addActionListener(new java.awt.event.ActionListener() 
        public void actionPerformed(java.awt.event.ActionEvent evt) 
            readerStopButton_ActionPerformed(evt);
        
    );
    operationButtons_.add(readerStopButton_);

编辑:这是按钮在我看来的屏幕截图。关于布局,我有很多不知道的地方,所以我很可能会遗漏一些关键信息。但基本上我让 NetBeans 完成所有工作,除了提供 HTML 文本。

编辑:放置一个显示所有按钮的替换屏幕截图。请注意,不使用 HTML 的那些(单字的)是正确对齐的,而使用 HTML 的两个是混乱的。

【问题讨论】:

【参考方案1】:

原因是你限制了按钮的大小,默认情况下按钮是有边距的,你可以按如下方式去掉边距:

readerStopButton_.setMargin(new Insets(0,-30, 0,-30));

package swing;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Insets;

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

public class HTMLTextTest 
    public static void main(String[] args) 
        SwingUtilities.invokeLater(new Runnable() 
            public void run() 
                createAndShowGUI();
            
        );
    

    private static void createAndShowGUI() 

        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());

        JPanel operationButtons_ = new JPanel();

        JButton readerStopButton_ = new JButton();
        readerStopButton_.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.light"));
        readerStopButton_.setFont(new java.awt.Font("Geneva", 0, 12)); // NOI18N
        readerStopButton_.setText("<html><center>READER<br>STOP</center></html>\n");
        readerStopButton_.setToolTipText("<html><b>Stop</b> button is currently inactive.  ");
        readerStopButton_.setMargin(new Insets(0,-30, 0,-30));
        readerStopButton_.setPreferredSize(new Dimension(66, 40));
        operationButtons_.add(readerStopButton_);

        readerStopButton_ = new JButton();
        readerStopButton_.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.light"));
        readerStopButton_.setFont(new java.awt.Font("Geneva", 0, 12)); // NOI18N
        readerStopButton_.setText("<html><center>READER<br>STOP</center></html>\n");
        readerStopButton_.setToolTipText("<html><b>Stop</b> button is currently inactive.  ");
        System.out.println(readerStopButton_.getPreferredSize());
        readerStopButton_.setPreferredSize(new Dimension(66, 40));
        operationButtons_.add(readerStopButton_);

        operationButtons_.add(new JButton("yCoder.com"));

        frame.add(operationButtons_);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    

【讨论】:

【参考方案2】:

不要忘记结束标签:

JButton button = new JButton("<html><center>READER<br>STOP</center></html>");

另见How to Use HTML in Swing Components

附录:我无耻地克隆了上面的@mre 的correct HTML 以生成以下图像:

【讨论】:

嗯,不,不是这样,我不认为。它确实尊重&lt;center&gt;标签(我也试过关闭那个标签)——如果我省略&lt;center&gt;,READER和STOP相对于彼此左对齐,但仍然在按钮上有点右对齐。 (编辑:您提到的链接确实显示居中,但不在NetBeans“表单”中,我现在高度依赖它并且不确定如何进行调整。 我已经更新了我的错误 HTML 以符合 @mre 的 answer,我会推迟。 我已经用我所看到的屏幕截图更新了问题。 FWIW,我正在使用 Lion。你的“红绿灯”看起来太大了,不像是 Lion,是吗? 嗯,这将其缩小到指定给 GUI 编辑器(或由其生成)的内容。我不确定迁移会改变这一点。顺便说一句,我认为工具提示的 HTML 中有错字。 这些按钮采用网格布局。我不小心将一个移出网格,其文本问题自行纠正。我想现在是重新审视整个肮脏的布局主题的好时机,因为我对它的无能继续让我感到痛苦。我现在不得不把这个问题放在一边,但是一旦我清楚地知道为什么(显然)网格布局会以这种方式影响文本对齐方式,我就会回到它。【参考方案3】:

我不确定你在说什么。我使用了你包含的代码,它工作得很好。


public final class HTMLTextButtonDemo 

    public static void main(String[] args)
        SwingUtilities.invokeLater(new Runnable()
            @Override
            public void run() 
                createAndShowGUI();             
            
        );
    

    private static void createAndShowGUI()
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());

        JButton readerStopButton_ = new JButton();
        readerStopButton_.setFocusPainted(false);
        readerStopButton_.setBackground(UIManager.getDefaults().getColor("Button.light"));
        readerStopButton_.setFont(new Font("Geneva", 0, 12)); // NOI18N
        readerStopButton_.setText("<html><center>READER<br>STOP</center></html>\n");
        readerStopButton_.setHorizontalTextPosition(SwingConstants.CENTER);

        frame.add(readerStopButton_);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    


HTML 文本居中对齐。很难想象你会看到不同的东西。

【讨论】:

+1 代表sscce;作为参考,我在com.apple.laf.AquaLookAndFeel 上看到了预期的结果。 当然,我的代码嵌入到数百行 NetBeans 生成的源代码中,这很可能是问题所在。我更新了原始问题以包括我看到的按钮的屏幕截图。 天哪,你真的需要使用 HTML 来让文本居中对齐吗? Java 开发人员你错过了这么多。

以上是关于如何在 NetBeans 中控制 JButton HTML 文本的居中?的主要内容,如果未能解决你的问题,请参考以下文章

Java Swing 在单击我要删除的 jpanel 中存在的 Jbutton 时删除 Jpanel

在 NetBeans GUI 设计器中重用 JPanel

如何在eclipse或netbeans中运行多个控制台

Netbeans matisse,自定义按钮图标属性错误

如何利用NetBeans Swing颜色选择器控制按钮背景

jFrames被这段代码冻结了吗? (附代码):Netbeans 8.2