Временное изменение цвета фона JButton? - PullRequest
1 голос
/ 17 марта 2010

Я новичок в Java, и мне нужна помощь. Я делаю небольшое настольное приложение Java, где у меня в основном сетка из 4 JButtons (сетка 2 x 2), и мне нужно изменить цвет фона отдельных JButtons, а через одну секунду вернуться к исходному цвету ( Игра, которую я пытаюсь сделать, похожа на Саймона, где вы должны следовать шаблону кнопок, которые загораются). У меня есть вектор, который содержит случайно сгенерированные числа в диапазоне от 1 до 4, и я хочу иметь возможность получить каждый элемент из вектора и получить соответствующую кнопку для изменения на другой цвет в течение одной секунды (например, если vector содержит 2 4 1, я бы хотел, чтобы кнопка 2 изменилась, затем кнопка 4 изменилась, затем кнопка 1 изменилась).

Возможно ли это или есть лучший способ сделать это с чем-то другим, кроме JButtons? Как мне это реализовать?

Кроме того, я использую Mac OS X, которая, судя по всему (основываясь на некоторых вещах, которые я читал на форумах), не любит изменение фона JButtons (думаю, это из-за внешнего вида системы), как я могу изменить это так работает на Mac?

Заранее спасибо за любую помощь:)

Ответы [ 4 ]

3 голосов
/ 17 марта 2010

Вы можете просто использовать метод setBackground (...) для установки цвета, а затем использовать таймер Swing для сброса фона при его срабатывании.

Edit:

Если ваша проблема в том, что метод setBackground () не работает на некоторых моделях LAF, то вы можете добавить к кнопке значок, который будет просто сплошным цветом. Затем, чтобы изменить цвет фона, просто измените значок.

3 голосов
/ 17 марта 2010

Одним из подходов является расширение JToggleButton и переопределение paintComponent() для отображения цвета. A javax.swing.Timer может контролировать время. Вот несколько более сложный пример .

private static class SimonButton extends JToggleButton {

    private final Color color;
    Dimension size = new Dimension(100, 100);

    public SimonButton(Color color) {
        this.color = color;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (this.isSelected()) {
            g.setColor(color);
        } else {
            g.setColor(Color.lightGray);
        }
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
    }

    @Override
    public Dimension getPreferredSize() {
        return size;
    }
}
2 голосов
/ 18 марта 2010

Для ваших целей вам не обязательно использовать JButton. Вы можете использовать JLabels или JPanels.

Во время инициализации вы можете setBackground() на каждом из них, чтобы установить его цвет, и добавить MouseListener к каждому, чтобы обнаружить щелчок.

Чтобы высветить паттерн Симона, создайте javax.swing.Timer, который срабатывает один раз в секунду. (Вы можете захотеть сделать задержку настраиваемой, если 1 секунда кажется долгой.) Для простоты таймер может setOpaque(false) на всех JLabels, затем setOpaque(true) на JLabel, цвет которого вы хотите мигать. , Обратите внимание, что вы можете подождать до следующей итерации таймера, прежде чем выполнять setOpaque(true), поэтому вспышки не запускаются вместе, если вы хотите мигать один и тот же JLabel несколько раз подряд.

Преимущество использования setOpaque() заключается в том, что вы можете настроить MouseListener на простой вызов setOpaque(true) при нажатии и setOpaque(false) при отпускании и проверить, был ли нажат правильный код JLabel, без необходимости повторного вычисления какой цвет должен использоваться для данного JLabel.

0 голосов
/ 13 февраля 2014
okJButton = new JButton() {
@Override
public void paintComponent(Graphics g) {
    g.setColor(Color.decode("0X123456"));
    g.fillRect(0, 0, getSize().width, getSize().height);
}
};
okJButton.setForeground(Color.white);
okJButton.setBorder(new LineBorder(Color.white, 1));
...