0

私はGUIプログラミングに不慣れで、いくつかのコードを試し、「HeaderPanel」と呼ばれるJPanelの背景を絶えず変更したいと思っていました。

なぜこれが思ったように機能しないのですか?(色は同じままです...)

private void changeColors() {
    int r = 0;
    int g = 155;
    int b = 12;

    while(true) {
        r = (r+1)%255;
        g = (g+1)%255;
        b = (b+1)%255;

        Color color = new Color(r,g,b);
        HeaderPanel.setBackground(color);
    }
}
4

3 に答える 3

3

whileループにより、再描画マネージャーが色の変更を回避できなくなります。

どういうわけか、バックグラウンドでリクエストを実行する必要があります。

public class TestLabel extends JLabel {

    private Timer timer;

    private int r = 0;
    private int g = 155;
    private int b = 12;

    public TestLabel() {

        setText("Hello world");
        setOpaque(true);

        timer = new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                System.out.println("tick");

                r = (r + 1) % 255;
                g = (g + 1) % 255;
                b = (b + 1) % 255;

                Color color = new Color(r, g, b);
                setBackground(color);

                System.out.println(color);

                if (r == 0 && b == 0 && g == 0) {

                    r = 0;
                    g = 155;
                    b = 12;

                }

                invalidate();
                revalidate();
                repaint();

            }
        });

        timer.setRepeats(true);
        timer.setCoalesce(true);
        timer.start();

    }
}

あなたは読みたいかもしれません

拡張例で更新

public class TestLabel extends JLabel {

    private Timer timer;

    private Object[][] colors = {{"Black", Color.BLACK},
        {"Blue", Color.BLUE},
        {"Cyan", Color.CYAN},
        {"Dark Gray", Color.DARK_GRAY},
        {"Gray", Color.GRAY},
        {"Green", Color.GREEN},
        {"Light Gary", Color.LIGHT_GRAY},
        {"Mangenta", Color.MAGENTA},
        {"Orange", Color.ORANGE},
        {"Pink", Color.PINK},
        {"Red", Color.RED},
        {"White", Color.WHITE},
        {"Yellow", Color.YELLOW}};

    public TestLabel() {

        setText("Hello world");
        setOpaque(true);

        timer = new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                System.out.println("tick");

                int index = (int) Math.round((colors.length - 1) * Math.random());

                Object[] group = colors[index];

                setBackground((Color)group[1]);
                setText((String)group[0]);

            }
        });

        timer.setInitialDelay(0);
        timer.setRepeats(true);
        timer.setCoalesce(true);
        timer.start();

    }
}
于 2012-08-10T23:21:58.793 に答える
0

私はスイング開発者ではありませんが、色のプロパティを変更するときに「塗り直し」などを行う必要はありませんか?一方、色を更新し続けるには、別のスレッドが必要になります。

要約

  • パネルの背景色を変更するコード(再描画を含む)
  • 上記のコードを呼び出すスレッド。
于 2012-08-10T23:25:17.483 に答える
-1

JPanelおそらくを呼び出すことによって、自分自身をペイントするように指示する必要がありますinvalidate()

于 2012-08-10T23:05:10.793 に答える