2012-03-14 4 views
4

При использовании setRollover (true), кнопки на панелях Swing являются плоскими без границ, а рамка рисуется только при наведении/нажатии кнопки. Однако, если кнопки сначала добавляются на панель, а затем панель добавляется на панель инструментов, это не работает. Есть ли простой способ, как достичь этого?Создание составного компонента Swing для JToolbar

Я хочу, чтобы кнопки были в JPanel, чтобы заставить их действовать как один компонент (представьте себе пейджинговый компонент с кнопками «первая/предыдущая/следующая/последняя страница»). Я также хочу, чтобы он работал независимо от L & F (как если бы JPanel не был между панелью инструментов и кнопками).

EDIT:

Сравнить кнопки One & Два (добавлены непосредственно) с кнопками Три & Четыре (добавлено через JPanel) в следующем примере:

import javax.swing.*; 

public class ToolbarTest extends JFrame { 
    ToolbarTest() { 
     JToolBar toolbar = new JToolBar(); 
     toolbar.setRollover(true); 

     JButton button = new JButton("One"); 
     button.setFocusable(false); 
     toolbar.add(button); 

     button = new JButton("Two"); 
     button.setFocusable(false); 
     toolbar.add(button); 

     JPanel panel = new JPanel(); 
     button = new JButton("Three"); 
     button.setFocusable(false); 
     panel.add(button); 

     button = new JButton("Four"); 
     button.setFocusable(false); 
     panel.add(button); 

     toolbar.add(panel); 

     add(toolbar); 
     pack(); 
    } 

    public static void main(String[] args) throws Throwable { 
     // optional: set look and feel (some lf might ignore the rollover property) 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) {  // or "Windows", "Motif" 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 

     ToolbarTest frame = new ToolbarTest(); 
     frame.setVisible(true); 
    } 
} 

Ниже приведены скриншоты:

Панель инструментов на Nimbus LF:

The toolbar on Nimbus LF

Та же панель инструментов при наведении курсора на вторую кнопку (курсор мыши не отображается):

Hovered Nimbus

Та же панель инструментов на Windows, LF:

The same toolbar on Windows LF

Я бы хотел, чтобы кнопки «Три» и «Четыре» работали так же, как кнопки «Один» и «Два».

+1

не видел этого. отредактируйте вопрос с помощью вашего [SSCCE] (http://sscce.org/) – mKorbel

+0

Я добавил пример. – Jirka

+0

должно быть JToolBar ???, вам нужно перемещаться с помощью JToolBar на экране ???, – mKorbel

ответ

1

1) Я бы предложил to set JMenuBar as container вместо JToolbar,

недостатков:

  • не является движимым и отрезным, ни из Container

  • мог по размещен везде, но только внутри контейнера, как и другой JComponent с использованием LayoutManager


2) для JToolBar было бы лучше, чтобы разместить там один JPanel вложен другой JComponents, как показывает из вашего примера кода


3) в вашем примере кода вы определяете один JButton Fouth раз, в Java требуется определить как отдельный Objects

+0

Объявление 3): Я определяю 4 отдельных объекта JButton. Только переменная используется повторно. Объекты нет. – Jirka

+0

Я не уверен, что понимаю. Я хочу получить эффект roll-over для кнопок, встроенных в панель, а не только добавленную кнопку. Но если я использую JMenuBar, как вы предлагаете, я не получаю эффекта для каких-либо кнопок. – Jirka

1

Использование другого JToolbar вместо JPanel.

Но: тогда я бы (или, может быть, нет?) Возникла проблема, если бы я хотел включить составной компонент в диалог или что-то еще, кроме панели инструментов.(Это было бы похоже на два типа кнопок: один для панелей инструментов и один для остальных)

это часть кода из вопроса, добавляющая панель для добавления панели инструментов.

JToolBar component = new JToolBar(); 
component.setRollover(true); 
component.setBorder(null); 
component.setFloatable(false); 

button = new JButton("Three"); 
button.setFocusable(false); 
component.add(button); 

button = new JButton("Four"); 
button.setFocusable(false); 
component.add(button); 

toolbar.add(component);