在我的程序中,我试图在框架内创建一个工具栏。在工具栏中,我有三个按钮,它们用图片而不是文本表示。
问题是,我发现如果在构造函数中创建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
调用该方法。然后你会得到一致的体验。(我建议只捕获UnsupportedLookAndFeelException
和ReflectiveOperationException
,并且至少记录任何异常,而不是只是继续没有任何错误的跟踪,太…)