1

我一直在重建我几个月前做的旧的 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();
    }

}

编辑:是的,所有图像都在正确的文件夹中并且命名正确。那里不用担心。

4

1 回答 1

5
public PaintFrame()
{
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); // ***** telling Java to render the GUI
    setSize(1150, 650); 
    setLocationRelativeTo(null); 
    setResizable(false);
    setLayout(new BorderLayout());
    setTitle("Paint 2.0");

    addComponents(); // Add everything to the JFrame **after** rendering it! **
}

将所有组件添加到 GUIsetVisible(true)之前不要调用。否则无法保证调用后添加的组件会被渲染。setVisible(true)

于 2013-08-24T20:25:31.850 回答