我一直在重建我几个月前做的旧的 MS-paint 复制猫,而 Swing 又一次给我带来了一些老问题。其中一个让我和其他几个人难倒了几天。我有一个自定义的 JFrame,我用它来放置我的所有组件,以及用于表示用户可以选择的各种颜色和工具的自定义 JButton。现在,问题是我的程序没有显示我的大部分按钮。这是我的 ColorButton 类:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
public class ColorButton extends JButton implements ActionListener
{
private static final long serialVersionUID = 1L;
Color color;
public ColorButton(Color color, String name)
{
this.color = color;
setButtonIcon(name);
}
private void setButtonIcon(String name)
{
ImageIcon icon = new ImageIcon("images/" + name);
setIcon(icon);
System.out.println("Icon set.");
}
@Override
public void actionPerformed(ActionEvent event)
{
}
}
基本上,这个类只是一个更好的按钮,我可以重用它并动态放置到主框架上。我已经设置好它需要一个颜色(设置用户的光标颜色)和一个字符串(为了从资源文件夹中获取 ImageIcon)。这是我必须添加所有内容的 JFrame。
import java.awt.BorderLayout;
import java.awt.Color;
import java.util.ArrayList;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;
public class PaintFrame extends JFrame // Frame to place all items on
{
private static final long serialVersionUID = 1L;
public PaintFrame()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Set the program to close if the user wishes
setVisible(true); // Set screen to visible
setSize(1150, 650); // Set screen size
setLocationRelativeTo(null); // Set frame to start in middle of screen
setResizable(false);
setLayout(new BorderLayout()); // Set a suitable layout for the panel
setTitle("Paint 2.0");
addComponents(); // Add everything to the JFrame
}
// List to hold all of the color buttons
ArrayList<ColorButton> colorButtons;
private void createColorButtons() // Create and add all color buttons
{
colorButtons = new ArrayList<ColorButton>();
colorButtons.add(new ColorButton(Color.BLACK, "black_paint.png"));
colorButtons.add(new ColorButton(Color.WHITE, "white_paint.png"));
// colorButtons.add(new ColorButton(new Color(22, 10, 255), "blue_paint.png"));
// colorButtons.add(new ColorButton(new Color(163, 92, 45), "brown_paint.png"));
// colorButtons.add(new ColorButton(new Color(19, 175, 50), "dark_green_paint.png"));
// colorButtons.add(new ColorButton(new Color(22, 255, 34), "green_paint.png"));
// colorButtons.add(new ColorButton(new Color(58, 209, 255), "light_blue_paint.png"));
// colorButtons.add(new ColorButton(new Color(255, 84, 33), "orange_paint.png"));
// colorButtons.add(new ColorButton(new Color(255, 86, 243), "pink_paint.png"));
// colorButtons.add(new ColorButton(new Color(168, 11, 121), "purple_paint.png"));
// colorButtons.add(new ColorButton(new Color(255, 0, 0), "red_paint.png"));
// colorButtons.add(new ColorButton(new Color(255, 241, 45), "yellow_paint.png"));
colorButtons.add(new ColorButton(Color.WHITE, "eraser.png"));
}
JPanel colorButtonPanel;
private void addComponents() // Add all the components to the screen
{
createColorButtons();
colorButtonPanel = new JPanel();
colorButtonPanel.setLayout(new BoxLayout(colorButtonPanel,
BoxLayout.X_AXIS));
colorButtonPanel.setBorder(new TitledBorder("Colors & Tools"));
for (ColorButton button : colorButtons)
{
colorButtonPanel.add(button);
}
// Add Panels
add(BorderLayout.SOUTH, colorButtonPanel);
}
}
因此,如您所见,该类继承自 JFrame,并且所有组件都添加到addComponents()
. 我认为问题出在的方法是在createColorButtons()
. 现在,所有未显示的按钮都被注释掉,其他按钮是唯一有效的按钮。这里的问题非常具体。如果我用任何不起作用的按钮启动程序(即任何colorButtons.add(foo)
被注释掉的按钮),那么框架就会完全空出来。没有任何按钮出现,只是一个空白框。但是,如果我在所有这些按钮都被注释掉的情况下启动程序,那么我仍然可以获得这三个按钮。
这些按钮与其他按钮的唯一不同之处在于,不会显示的按钮使用自定义创建的颜色,而其他按钮使用 Java API 中包含的预设颜色。我想不出任何原因会导致任何问题,但如果您不这么认为,请告诉我。如果您需要更多详细信息、代码或任何您能想到的可以帮助您回答问题的内容,也请告诉我。谢谢。
为添加措施添加了主要方法:
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Start // Start the program
{
public static void main(String[] args)
{
try // Get default system look & feel
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (
UnsupportedLookAndFeelException |
ClassNotFoundException |
InstantiationException |
IllegalAccessException e)
{
e.printStackTrace();
}
new PaintFrame();
}
}
编辑:是的,所有图像都在正确的文件夹中并且命名正确。那里不用担心。