Создание составного компонента Swing для JToolbar - PullRequest
4 голосов
/ 14 марта 2012

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

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

РЕДАКТИРОВАТЬ:

Сравнить кнопки 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

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

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Использование другого 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);
1 голос
/ 14 марта 2012

1) Я бы предложил установить JMenuBar в качестве контейнера , а не JToolbar,

Недостатки:

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

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


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


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

...