2010-07-07 2 views
3

У меня возникли проблемы с появлением JSeparator внутри JToolBar. Моя панель инструментов создается следующим образом:Почему addSeparator() не работает с моим JToolBar?

public class ToolBar extends JToolBar { 
    super(); 

    FlowLayout layout = new FlowLayout(FlowLayout.LEFT, 10, 5); 
    setLayout(layout); 

    add(new JButton("Button 1")); 
    addSeparator(); 
    add(new JButton("Button 2")); 
    add(new JButton("Button 3")); 
    addSeparator(); 

    // Show 
    setVisible(true); 
    setFloatable(false); 

} 

Любые мысли были бы очень благодарны, я пытался получить эту работу на пути слишком долго> (

+0

Hm, вы уверены, что код при условии, что вы действительно используете, я не уверен, что это будет компилировать; является ли декларация метода отсутствующей ...? –

+0

fd, обратился к вашему комментарию, удалив все пользовательские коды. Это должно легко компилироваться и все еще демонстрирует проблему, которую я надеюсь решить. Благодаря! – Hamy

ответ

4

Попытка код там, когда я называю addSeparator() метод создает пространство между кнопками, но без видимой линии разделения.

Но если изменить метод addSeparator(new Dimension(20,20)) он затем создает видимую линию разделения.

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

Я запускаю его на Mac OSX.

+0

Да, это то же обходное решение, с которым я столкнулся. Я думаю, что это может быть просто проблемой с OS X LAF – Hamy

+0

. Я также обнаружил, что если вы оставите макет по умолчанию на панели инструментов, там также появится пунктирная линия. – Trejkaz

2

Самая большая проблема, с которой вы сталкиваетесь, заключается в том, что нет необходимости в подклассе JToolBar и задан макет на нем. Просто создайте экземпляр и начните добавлять кнопки и разделители.

В целом команда Swing не рекомендует подклассифицировать компоненты Swing.

Вы код должен выглядеть следующим образом:

JToolBar t = new JToolbar(); 

t.add(new JButton("Button 1")); 
t.addSeparator(); 
t.add(new JButton("Button 2")); 
t.add(new JButton("Button 3")); 
t.addSeparator(); 

// Show 
t.setVisible(true); 
t.setFloatable(false); 

Последний совет должен был бы не использовать кнопки. Используйте действия. Таким образом, такие же действия можно использовать на панели инструментов, в меню. Более подробная информация на http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html

UPDATE: Пути разделитель панели выглядит зависит от LAF вы используете.

+0

Eugener, я действительно боюсь * с этим. У меня есть тонна подклассифицированных элементов - JToolbar, JPanel, JButton и т. Д. - для которых большинство из них вообще не обязательно должны быть подклассами. Я только пытался не писать весь свой код в один метод или один класс! Я могу это сделать, но это похоже на 20 страниц и трудно поддерживать. В некотором смысле, я знаю, что подклассификация - это не то, что нужно делать, но я также не хочу огромных недостижимых файлов :(В принципе, я не знаю «правильного» ответа здесь. У вас есть общий совет для это? – Hamy

+2

Наиболее распространенный способ борьбы с этим - создать методы «сборки». Например, если вам нужно создать панель инструментов, вы создаете метод JToolBar buildToobar(), в котором вы создаете, настраиваете и возвращаете свою панель инструментов. Единственный раз, когда вы должны подклассифицировать компоненты Swing, - это когда вам нужно добавить к ним новое состояние и/или поведение. –

+0

Hm. Полагаю, я мог бы использовать класс Factory, так что я не закончил с тем, что мой основной класс был вздут с помощью методов build ...()? – Hamy

0

Я встретил ту же проблему. Я обнаружил, что основная причина была вызвана максимальным размером.

После его настройки это стало нормальным.

// --------------------------------------- 
    // debug below: 
    // --------------------------------------- 
    JSeparator separator = new JSeparator(JSeparator.VERTICAL); 
    System.err.println("getMaximumSize(): " + separator.getMaximumSize()); 
    System.err.println("getMinimumSize(): " + separator.getMinimumSize()); 
    separator.setMaximumSize(new Dimension(2, separator.getMaximumSize().height)); 


    // --------------------------------------- 
    // real sample below 
    // --------------------------------------- 
    // adds a vertical space bar 
    toolBar.add(Box.createHorizontalStrut(5)); 

    // adds a vertical separator 
    JSeparator separator = new JSeparator(JSeparator.VERTICAL); 
    Dimension maximumSize = separator.getMaximumSize(); 
    maximumSize.width = 2; 
    separator.setMaximumSize(maximumSize); // Important! Update it! 
    toolBar.add(separator); 

    // adds a vertical space bar 
    toolBar.add(Box.createHorizontalStrut(5)); 

по TJ Tsai ([email protected])

Смежные вопросы