Java Swing: как JToolbar меняет внешний вид кнопки? - PullRequest
4 голосов
/ 22 декабря 2011

Когда вы добавляете JButton к JToolbar, кнопка приобретает особый вид (не тот, который вы добавляете в Jpanel). Я создал какой-то компонент, похожий на JToolbar, и мне хотелось бы того же поведения. Проблема: я проверил класс JToolbar, чтобы найти какой-то конкретный код, отвечающий за изменение внешнего вида добавленных компонентов (изменение метода рисования для конкретного компонента или делегатов пользовательского интерфейса и т. Д.). Я ничего не нашел! Я не понимаю, как работает JToolbar. Может ли кто-нибудь объяснить мне, как это работает?

Большое спасибо,

Эрв Гийом

Ответы [ 2 ]

4 голосов
/ 22 декабря 2011

Это, кажется, обрабатывается методом update() класса MetalButtonUI.Вот код из JDK5_07:

public void update(Graphics g, JComponent c) {
    AbstractButton button = (AbstractButton)c;
    if ((c.getBackground() instanceof UIResource) &&
              button.isContentAreaFilled() && c.isEnabled()) {
        ButtonModel model = button.getModel();
        if (!MetalUtils.isToolBarButton(c)) {
            if (!model.isArmed() && !model.isPressed() &&
                    MetalUtils.drawGradient(
                    c, g, "Button.gradient", 0, 0, c.getWidth(),
                    c.getHeight(), true)) {
                paint(g, c);
                return;
            }
        }
        else if (model.isRollover() && MetalUtils.drawGradient(
                    c, g, "Button.gradient", 0, 0, c.getWidth(),
                    c.getHeight(), true)) {
            paint(g, c);
            return;
        }
    }
    super.update(g, c);
}

Метод isToolBarButton() просто проверяет, является ли родительский контейнер JToolBar, поэтому я думаю, что одно из решений - всегда добавлять свой JButton в JToolBar, а затем добавлять панель инструментовв ваш настоящий Контейнер.

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

1 голос
/ 22 декабря 2011

Я думаю, что это не что иное, как кнопка отключения.если вы сделаете так, чтобы ваша кнопка была отключена, она будет похожа на кнопку на панели инструментов (за исключением черного цвета текста).Чтобы изменить цвет текста отключенной кнопки, вы можете переопределить свойство по умолчанию UIManager.И чтобы кнопка работала с большей вероятностью, как в панели инструментов, добавьте к ней mouseListener и измените ее состояние включения в mouseEnter и метод Exit.

Пример:

    JFrame frame = new JFrame("tool bar button demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(150, 150);
    frame.setLayout(new FlowLayout());

    JToolBar bar = new JToolBar();
    bar.add(new JButton("A button"));
    frame.add(bar);

    // to make text black in disabled button.
    UIManager.getDefaults().put("Button.disabledText",Color.BLACK);

    JButton button = new JButton("A button");
    button.setEnabled(false);
    // if you are setting true or not changing the roll over property 
    // of toolBar then following listerner help to give similar effect
    button.addMouseListener(new MouseListener() {
        @Override
        public void mouseReleased(MouseEvent me) {
        }
        @Override
        public void mousePressed(MouseEvent me) {
        }
        @Override
        public void mouseExited(MouseEvent me) {
            ((JButton)me.getSource()).setEnabled(false);
        }
        @Override
        public void mouseEntered(MouseEvent me) {
            ((JButton)me.getSource()).setEnabled(true);
        }
        @Override
        public void mouseClicked(MouseEvent me) {
        }
    });
    frame.add(button);

    frame.setVisible(true);
...