在构造函数内部创建对象与在构造函数外部创建对象的区别



在我的程序中,我试图在框架内创建一个工具栏。在工具栏中,我有三个按钮,它们用图片而不是文本表示。

问题是,我发现如果在构造函数中创建JButton对象,与在构造函数之外(但仍然在JFrame类中)创建JButton对象相比,按钮的显示方式有所不同。

在构造函数中创建按钮的代码:

public class Tool extends JFrame
{
    public Tool()
    {
         JToolbar bar = new JToolBar();
         JButton button1 = new JButton(img1);
         JButton button2 = new JButton(img2);
         JButton button3 = new JButton(img3);
         bar.add(button1);
         bar.add(button2);
         bar.add(button3);
    }
}

然后这些按钮被整齐地添加到工具栏中。

但是,如果我这样做:

public class Tool extends JFrame
{
     JButton button1 = new JButton(img1);
     JButton button2 = new JButton(img2);
     JButton button3 = new JButton(img3); 
public Tool()
        {
             JToolbar bar = new JToolBar();
             bar.add(button1);
             bar.add(button2);
             bar.add(button3);
        }
 }

然后,按钮仍然被添加到工具栏中。但是,它们的格式并没有很好,它们的周围似乎有一个边框(类似于如果你从谷歌上复制了一张图片,并将其粘贴到幻灯片上,例如,你会得到一个方形的边框)。

为什么会这样?为什么在哪里创建JButton对象很重要?

提前谢谢你。

编辑(完全正确的代码):在下面的代码中,button1和button2是在构造函数中创建的,而button3是在构造函数外部创建的。正如您所看到的,与其他两个按钮相比,按钮周围有一个带有文本"Java"的模糊白色边框。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Tool extends JFrame
{
        JButton button3 = new JButton("Java");

    public Tool()
    {
        super("Tool");
        setLookAndFeel();
        setSize(370, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton button1 = new JButton("Help");
        JButton button2 = new JButton("SOS");
        //build toolbar
        JToolBar bar = new JToolBar();
        bar.add(button1);
        bar.add(button2);
        bar.add(button3);
        // build text area
        JTextArea edit = new JTextArea(8, 40);
        JScrollPane scroll = new JScrollPane(edit);
        // create frame
        BorderLayout border = new BorderLayout();
        setLayout(border);
        add("North", bar);
        add("Center", scroll);
        setVisible(true);
    }
    private void setLookAndFeel()
    {
        try
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        }
        catch(Exception e)
        {
        }
    }
    public static void main(String[] arguments)
    {
        Tool loot = new Tool();
    }
}

在第一种情况下,在构造函数中只声明了三个局部变量

在第二种情况下,您的Tool类有三个字段。然后,您可以在其他方法中引用这些字段,它们是对象状态的一部分。

这本身是一个显著的差异,但不应该影响行为本身。然而,也会影响创建JButton实例的时间——当它们是字段时,初始化器在调用setLookAndFeel和调用setSize之前执行。

经过一些试验后,看起来它的外观和感觉在这里很重要。我建议您更改代码以使setLookAndFeel成为static方法,然后在创建任何 GUI组件之前从main调用该方法。然后你会得到一致的体验。(我建议只捕获UnsupportedLookAndFeelExceptionReflectiveOperationException,并且至少记录任何异常,而不是只是继续没有任何错误的跟踪,太…)

相关内容

  • 没有找到相关文章

最新更新