Java JButton不采取行动';当preferredSize为非默认值时的名称

Java JButton不采取行动';当preferredSize为非默认值时的名称,java,swing,netbeans,action,jbutton,Java,Swing,Netbeans,Action,Jbutton,我刚刚注意到,JButton不会将其文本更改为耦合的操作对象的名称值,至少以下两个条件为真: 按钮的preferredSize属性不是默认值 按钮的text属性不是默认的“”(空) 可能还有其他属性值的组合使按钮忽略操作的名称,但是当我将其中一个设置为默认值时,它会工作 我将陈述一个明显的事实,即操作是正确注册的,而hideActionText属性是false。此外,我应该说我通过Netbeans GUI设计器中的properties面板设置了这些属性 几次谷歌搜索什么也没找到。这是正常行为

我刚刚注意到,
JButton
不会将其文本更改为耦合的
操作
对象的
名称
值,至少以下两个条件为真:

  • 按钮的
    preferredSize
    属性不是默认值
  • 按钮的
    text
    属性不是默认的“”(空)
可能还有其他属性值的组合使按钮忽略操作的名称,但是当我将其中一个设置为默认值时,它会工作

我将陈述一个明显的事实,即操作是正确注册的,而
hideActionText
属性是false。此外,我应该说我通过Netbeans GUI设计器中的properties面板设置了这些属性


几次谷歌搜索什么也没找到。这是正常行为吗?可以解决吗?

我想说两件事:

  • 为什么要强制JButton的preferredSize(否则它只是基于它包含的文本和图标)
  • 如果希望JButton的文本来自动作名称,为什么要设置JButton的文本
  • 我认为所描述的行为没有任何问题。如果未提供文本,则默认为操作的名称(如果有)。否则,它将是空的。 如果您想强制使用preferredSize,那么在某些情况下,您有权这样做

    如果希望显示操作名称,只需在JButton上不设置另一个“text”值即可

    编辑


    如果我设置了文本,但没有设置首选大小,我仍然可以看到按钮文本(即使文本太小太合适,也会在文本上显示“…”。在此SSCCE上亲自测试:

    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.io.IOException;
    
    import javax.swing.AbstractAction;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    public class Main {
    
        public static void main(String[] args) throws IOException {
            JFrame frame = new JFrame();
            frame.setTitle("frame");
            final JButton button = new JButton(new AbstractAction("Action text") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.err.println("Hello");
                }
            });
            button.setText("Button text which is a lot longer");
            button.setPreferredSize(new Dimension(100, 30));
            frame.add(button);
            frame.pack();
            frame.setVisible(true);
        }
    }
    

    我想说两件事:

  • 为什么要强制JButton的preferredSize(否则它只是基于它包含的文本和图标)
  • 如果希望JButton的文本来自动作名称,为什么要设置JButton的文本
  • 我认为所描述的行为没有任何问题。如果未提供文本,则默认为操作的名称(如果有)。否则,它将是空的。 如果您想强制使用preferredSize,那么在某些情况下,您有权这样做

    如果希望显示操作名称,只需在JButton上不设置另一个“text”值即可

    编辑


    如果我设置了文本,但没有设置首选大小,我仍然可以看到按钮文本(即使文本太小太合适,也会在文本上显示“…”。在此SSCCE上亲自测试:

    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.io.IOException;
    
    import javax.swing.AbstractAction;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    public class Main {
    
        public static void main(String[] args) throws IOException {
            JFrame frame = new JFrame();
            frame.setTitle("frame");
            final JButton button = new JButton(new AbstractAction("Action text") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.err.println("Hello");
                }
            });
            button.setText("Button text which is a lot longer");
            button.setPreferredSize(new Dimension(100, 30));
            frame.add(button);
            frame.pack();
            frame.setVisible(true);
        }
    }
    

    preferredSize的原因纯粹是为了美观和用户体验,例如,我希望它能吸引更多用户的注意力/使其更加突出。文本的原因是按钮在GUI设计器中仍然有意义。我承认有一些简单的解决办法,但它们一开始就不是必需的…@MarioDeSchaepmeester你认为应该有什么不同?我同意这是预期的行为。你是说你想为按钮指定一个名称,但仍然让它覆盖名称并显示操作?好的,我知道你想设置一个文本(在GUI desogner中预览),但你不应该这样做。GUI设计者应该提供一种输入示例值的方法,该值仅用于显示按钮可能包含的内容。对于你的问题,我看不到任何其他的“变通方法”。@YoussefG。这就是我要说的,如果我不更改preferredSize,它就会起作用。@GuillaumePolet Netbeans没有提供我所知道的那种功能。正如我所说的,单独设置文本是可行的。我不明白为什么以及如何使用
    preferredSize
    属性来影响按钮是否接受操作文本。似乎是java API中的一个缺陷。。。当然,如果只是因为这样,操作文本可能不适合按钮。但这是程序员的责任。preferredSize的原因纯粹是为了美观和用户体验,例如,我希望它能吸引更多用户的注意力/使其更加突出。文本的原因是按钮在GUI设计器中仍然有意义。我承认有一些简单的解决办法,但它们一开始就不是必需的…@MarioDeSchaepmeester你认为应该有什么不同?我同意这是预期的行为。你是说你想为按钮指定一个名称,但仍然让它覆盖名称并显示操作?好的,我知道你想设置一个文本(在GUI desogner中预览),但你不应该这样做。GUI设计者应该提供一种输入示例值的方法,该值仅用于显示按钮可能包含的内容。对于你的问题,我看不到任何其他的“变通方法”。@YoussefG。这就是我要说的,如果我不更改preferredSize,它就会起作用。@GuillaumePolet Netbeans没有提供我所知道的那种功能。正如我所说的,单独设置文本是可行的。我不明白为什么以及如何使用
    preferredSize
    属性来影响按钮是否接受操作文本。似乎是java API中的一个缺陷。。。当然,如果只是因为这样,操作文本可能不适合按钮。但这是程序员的责任。另请参见。@trashgood好吧,谢谢,现在我知道我应该尽可能避免使用首选尺寸。我使用系统L&F,所以我不能使用SizeVariant…另请参见。@Trashgood好的,谢谢,现在我知道我应该尽可能避免使用首选尺寸。我使用系统L&F,所以我不能使用SizeVariant。。。