【问题标题】:Difference between creating an object within the constructor vs outside of the constructor?在构造函数内创建对象与在构造函数外创建对象之间的区别?
【发布时间】:2014-03-24 18:51:11
【问题描述】:

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

问题是我发现,如果我在构造函数中创建 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 演示文稿中,并且你在图片周围有一个方形边框)。

为什么会这样?为什么我在哪里创建 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();
    }
}

【问题讨论】:

  • 我看不出它们之间有任何功能差异。顺便说一句,img1img2、.. 是什么
  • 没有功能上的区别,但它以一种不那么吸引人的方式改变了显示(如果我在构造函数之外创建对象)。抱歉,img1、img2 和 img3 是代表 GUI 中按钮的图像(它们也是在 JFrame 类中创建的)。
  • 发布可编译代码,并解释它的吸引力如何。我们看不到您的屏幕。

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


【解决方案1】:

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

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

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

经过一番尝试,似乎这里的外观和感觉很重要。我建议您更改代码以使setLookAndFeel 成为static 方法,然后在创建任何 GUI 组件之前从main 调用它。然后,您将获得一致的体验。 (我建议只捕获 UnsupportedLookAndFeelExceptionReflectiveOperationException,并至少记录任何异常,而不是继续不跟踪任何问题......)

【讨论】:

  • 为什么这会改变 GUI 的外观,相对于工具栏上的按钮?
  • @vmck:正如我在编辑后的答案中所说,鉴于您没有对 bar 变量做任何事情,我很惊讶竟然创建了一个工具栏。如果您发布完整的代码以便我们可以重现该问题,这将非常有帮助。
  • 我已经发布了完整正确的代码(差异很小,这是我在原始问题中所说的)。但是,我认为您需要保存三张图片才能按照我的方式运行它...或者您是否希望我更改它以便按钮在 GUI 中由文本而不是图像表示?
  • @vmck 您能否发布您所看到的 GUI 差异比较的屏幕截图?
  • 我刚试过......显然我没有足够的声誉。如果对象是在构造函数之外创建的,则与在构造函数中创建的其他按钮相比,它周围会有一个细白边框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 2016-07-01
  • 2012-02-05
  • 1970-01-01
  • 2011-05-22
  • 2017-09-20
  • 1970-01-01
相关资源
最近更新 更多