Java Swing: изменение цвета моделей и кнопок - PullRequest
0 голосов
/ 09 февраля 2012

Я очень запутался в том, что именно модели должны делать в java swing.В настоящее время я в основном пытаюсь создать модель для JButton, чтобы определить, является ли она isPressed ();Моя основная цель этой модели - сделать что-то вроде этого:

if(myButton.isPressed() ) {
    myButton.setBackground(Color.RED);
}
else{//when any other button is pressed?
    myButton.setBackground(Color.WHITE);
}

В настоящее время мой код выглядит примерно так:

    numberButton = new JButton("Num");
    numberButton.setBounds(20,40,80,30);
    numberButton.addChangeListener(new ChangeListener() {
        public void stateChanged (ChangeEvent e){
           if (model.isPressed() ){
              doColorChange(model);
           }
        }
    });

Я понимаю, что это совершенно неправильно, но яЯ не знаю, где, и я не нашел учебник, который действительно объясняет, что я делаю не так или зачем мне вообще нужна модель для этого.

Пожалуйста, помогите мне восстановить здравомыслие!Большое спасибо!

Ответы [ 4 ]

4 голосов
/ 09 февраля 2012

Используйте радиокнопки в группе кнопок.

RedAndWhite

import java.awt.image.BufferedImage;
import java.awt.*;
import javax.swing.*;

import java.net.URL;
import javax.imageio.ImageIO;

class RedAndWhite {

    public static Image getColoredImage(Color color, int size) {
        BufferedImage bi = new BufferedImage(
            size,
            size,
            BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.getGraphics();
        g.setColor(color);
        g.fillRect(0,0,size,size);

        g.dispose();
        return bi;
    }

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Image red = getColoredImage(Color.RED, 32);
                Image white = getColoredImage(Color.WHITE, 32);
                JPanel p = new JPanel(new GridLayout(1,0,5,5));

                ButtonGroup bg = new ButtonGroup();
                for (int ii=0; ii<6; ii++) {
                    JRadioButton b = new JRadioButton();
                    b.setSelectedIcon(new ImageIcon(red));
                    b.setIcon(new ImageIcon(white));
                    b.setContentAreaFilled(true);
                    bg.add(b);
                    p.add(b);
                }

                JOptionPane.showMessageDialog(null, p);
            }
        });
    }
}
2 голосов
/ 09 февраля 2012

Я думаю, что вам нужно зарегистрировать ActionListener или Action с помощью кнопки, чтобы обрабатывать нажатия кнопок, верно?

Редактировать : перечитывает ваш ответВы хотите выделить кнопку, которая нажимается, верно?В этом случае попробуйте использовать свой собственный пользовательский интерфейс кнопки (создайте подкласс того, что вы используете).У BasicButtonUI есть метод protected void paintButtonPressed(Graphics g, AbstractButton b), который можно переопределить, чтобы применить выделение при нажатии кнопки.

1 голос
/ 09 февраля 2012

Существуют следующие способы, как сделать JButton лучше

1). Самый лучший способ - рисовать только границы из ButtonModel для событий мыши

2) переопределить весь BasicButtonUI со всеми соответствующими Look и Feels

3) поместить туда Icons и переопределить все возможные методы , реализованные в JButton API

4) лучше всего было бы реализовать Custom Look and Feel

5) создать Custom JComponent на основе JLabel/JComponent

0 голосов
/ 09 февраля 2012

Я всегда считал, что ButtonModel предназначен (главным образом) для использования классом пользовательского интерфейса для рендеринга кнопки в ее состоянии «нажата / не нажата / активирована / выбрана / ...» и отслеживается ее изменение.

Если вы просто хотите покрасить кнопку в красный цвет (чего вы хотите?), Пока она нажата, ваше решение мне подходит.

Если у вас есть кнопка переключения (которая остается нажатой после нажатия на нее, чтобы указать «выбранное» состояние, вы можете использовать ItemListener и проверить на

ItemEvent.ITEM_STATE_CHANGED == ItemEvent.SELECTED // paint red
ItemEvent.ITEM_STATE_CHANGED == ItemEvent.DESELECTED // paint white

Если вы хотите выполнить логику приложения при нажатии кнопки, используйте ActionListener.

...