2

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

问题是我发现如果我在构造函数中创建 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();
    }
}
4

1 回答 1

3

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

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

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

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

于 2014-03-24T18:54:30.643 回答