1

数か月前に行った古い MS-paint のコピー cat を再構築してきましたが、Swing が再びいくつかの古い問題を引き起こしています。そのうちの1つは、私と他の数人の人々を数日間困惑させました. すべてのコンポーネントを配置するために使用するカスタム 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)
    {

    }
}

基本的に、このクラスは、再利用してメイン フレームに動的に配置できる優れたボタンです。Color (ユーザーのカーソルの色を設定するため) と文字列 (リソース フォルダーから 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)、コメントアウトされているボタン) を実装してプログラムを開始すると、フレームが完全に空になります。ボタンは何も表示されず、空白のフレームだけが表示されます。ただし、これらのボタンをすべてコメントアウトしてプログラムを開始すると、3 つのボタンを取得できます。

これらのボタンと他のボタンとの唯一の違いは、表示されないボタンはカスタム作成された色を使用し、他のボタンは Java API に含まれる事前設定された色を使用することです。それが問題を引き起こす理由は思いつきませんが、そうでない場合はお知らせください。また、質問への回答に役立つと思われる詳細、コード、その他の情報が必要な場合はお知らせください。ありがとう。

追加されたメジャーの追加された Main メソッド:

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 に答える