在构造函数中创建对象与构造函数外部之间的区别?

时间:2014-03-24 18:51:12

标签: java user-interface jbutton default-constructor jtoolbar

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

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

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

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);
        }
 }

然后,按钮仍会添加到工具栏中。但是,它们似乎没有很好地格式化,它们似乎在它们周围有一个边框(类似于你刚刚从谷歌复制图像并将其粘贴到powerpoint演示文稿上,例如,你在图像周围得到一个方形边框)。 / p>

为什么会这样?为什么我在创建JButton对象的地方很重要?

提前谢谢。

编辑(完整的CORRECT代码): 在下面的代码中,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();
    }
}

1 个答案:

答案 0 :(得分:3)

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

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

这本身就是一个显着的差异,但不应该影响行为本身。但是,会影响创建JButton个实例的时间 - 当他们重新生成字段时,初始化程序在您调用setLookAndFeel之前和之前执行致电setSize

经过一番实验,似乎它的外观和感觉在这里很重要。我建议您更改代码以使setLookAndFeel成为static方法,然后在创建任何 GUI组件之前从main调用该方法。然后,您将获得一致的体验。 (我建议只抓取UnsupportedLookAndFeelExceptionReflectiveOperationException至少记录任何异常,而不仅仅是继续没有任何错误的痕迹...... 。)