2011-12-22 2 views
4

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

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

Herve Гийого

ответ

4

Это, как представляется, обрабатывается 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().

+0

отличный код, спасибо, +1 – mKorbel

+0

Ok thx! Это именно то, что мне нужно! Я попытаюсь добавить myJButton в invsible JToolBar. – paranoia25

1

Я думаю, что нет ничего, кроме кнопки отключения. если вы сделаете так, чтобы ваша кнопка была отключена, она будет похожа на единицу в toolBar (кроме цвета черного текста). Чтобы изменить цвет текста отключенной кнопки, вы можете переопределить свойство UIManager по умолчанию. И чтобы сделать работу кнопки более вероятной, так как в toolBar добавьте 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); 
+0

Thx! Но мой вопрос в том, как JToolbar автоматически управляет внешним видом своих кнопок. Я бы хотел реализовать одно и то же для моего пользовательского виджета. – paranoia25