Java JTable и JToolBar странно изменяют размер

Сегодня я заметил очень странное поведение моей программы. В основном у меня есть JToolBar uder, который представляет собой JScrollPane с JTable. Оба внутри JPanel внутри JFrame. Каждый контейнер, использующий MigLayout.

Теперь, если я запускаю приложение, оно выглядит по умолчанию: введите здесь описание изображения

Но если я передвину JToolBar и верну его в исходное положение, теперь он будет выглядеть так: введите здесь описание изображения

Внезапно нет границ. Я бы предпочел, чтобы их вообще не было, но изменение внешнего вида графического интерфейса вообще не очень хорошая функция ... Пожалуйста, если вы знаете, что не так, помогите :)

КОД:

public class Gui extends JFrame {

private static final long serialVersionUID = 1L;
private JPanel mainPnl = null;
private JToolBar toolbar = null;
private Session session = null;

public Gui(Session session) {
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (UnsupportedLookAndFeelException e) {
    } catch (ClassNotFoundException e) {
    } catch (InstantiationException e) {
    } catch (IllegalAccessException e) {
    }

    this.session = session;

    setTitle("PRO2-Contact Manager v_0.1");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(800,420);
    setResizable(true);

    initMenu();
    initMainPnl();
    initToolbar();
    initTable();

    // KeyboardFocusManager manager =
    // KeyboardFocusManager.getCurrentKeyboardFocusManager();
    // manager.addKeyEventDispatcher(new MyDispatcher(aList));

    setLocationRelativeTo(null);
    setVisible(true);
}

private void initMenu() {
    JMenuBar menu = new JMenuBar();
    MenuListener ml = new MenuListener();

    JMenu file = new JMenu("File");
    file.setMnemonic(KeyEvent.VK_F);
    menu.add(file);

    JMenuItem exit = new JMenuItem("Exit");
    exit.setMnemonic(KeyEvent.VK_E);
    exit.addActionListener(ml);
    file.add(exit);

    JMenu help = new JMenu("Help");
    help.setMnemonic(KeyEvent.VK_H);
    menu.add(help);

    JMenuItem controls = new JMenuItem("Controls");
    controls.setMnemonic(KeyEvent.VK_C);
    controls.addActionListener(ml);
    help.add(controls);

    JMenuItem about = new JMenuItem("About");
    about.setMnemonic(KeyEvent.VK_A);
    about.addActionListener(ml);
    help.add(about);

    setJMenuBar(menu);
}

private void initMainPnl(){
    mainPnl = new JPanel(new MigLayout());

    add(mainPnl);
}

private void initToolbar() {
    toolbar = new JToolBar(JToolBar.HORIZONTAL);
    toolbar.add(new JButton());
    mainPnl.add(toolbar,"wrap");
}

private void initTable() {
    MyTable table = new MyTable(new MyTableModel(this));
    JScrollPane sp = new JScrollPane(table);
    sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

    mainPnl.add(sp,"w 100%, h 100%");
}}

person B.Gen.Jack.O.Neill    schedule 18.12.2011    source источник
comment
Как вы звоните new MenuListener()? MenuListener — это интерфейс.   -  person Paul    schedule 18.12.2011
comment
Также было бы более полезно, если бы вы опубликовали пример, демонстрирующий вашу проблему с классами, которые поставляются с JDK, если только ваши сторонние классы (miglaout, mytable) не являются причиной проблемы. Без дополнительных классов люди не смогут запускать ваш код, что ограничивает их возможности в помощи. Метод main тоже был бы хорош.   -  person Paul    schedule 18.12.2011


Ответы (1)


Технически JToolBar можно добавить в контейнер с любым ограничением компоновки. Автоматическое повторное добавление плавающей панели инструментов в контейнер поддерживается только для BorderLayout. Вместо добавления в mainPanel добавьте его в contentPane:

private void initToolbar() {
    toolbar = new JToolBar(JToolBar.HORIZONTAL);
    toolbar.add(new JButton());
    add(toolbar, BorderLayout.NORTH);
}

Кстати: ваш код не компилируется вне вашего контекста - MyPanel, MyTableModel, MenuListener - это локальные классы, недоступные больше нигде, плюс отсутствует основной метод. Для более быстрой помощи рассмотрите возможность поставки SSCCE в будущем :-)

person kleopatra    schedule 20.12.2011