在我的程序中,我正在尝试在框架内创建工具栏。在工具栏中,我有三个用图片而不是文本表示的按钮。
问题是我发现如果我在构造函数中创建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();
}
}
答案 0 :(得分:3)
在第一种情况下,您只在构造函数中声明了三个局部变量。
在第二种情况下,您的Tool
课程有三个字段。然后,您可以在其他方法中引用这些字段,它们是对象状态的一部分。
这本身就是一个显着的差异,但不应该影响行为本身。但是,也会影响创建JButton
个实例的时间 - 当他们重新生成字段时,初始化程序在您调用setLookAndFeel
之前和之前执行致电setSize
。
经过一番实验,似乎它的外观和感觉在这里很重要。我建议您更改代码以使setLookAndFeel
成为static
方法,然后在创建任何 GUI组件之前从main
调用该方法。然后,您将获得一致的体验。 (我建议只抓取UnsupportedLookAndFeelException
和ReflectiveOperationException
,至少记录任何异常,而不仅仅是继续没有任何错误的痕迹...... 。)