2010-10-26 3 views
1

Я пытаюсь изменить GUI. В нем размещается GLCanvas, отображающий содержимое JOGL.Java: Сложность с Swing

Вот код, чтобы настроить его:

private void setupWindow() { 
    this.frame = new JFrame(WINDOW_TITLE); 
    frame.setSize(width, height); 
    frame.setVisible(true); 

    frame.addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
      System.exit(0); 
     } 
    }); 

    JMenuBar menuBar = new JMenuBar(); 
    JMenu menu = new JMenu("File"); 
    menuBar.add(menu); 
    JMenuItem exitItem = new JMenuItem("Exit"); 
    exitItem.addActionListener(listener); 
    menu.add(exitItem); 
    frame.setJMenuBar(menuBar); 
} 

В настоящее время полотно занимает все пространство в окне, кроме строки меню. Я хотел бы сделать пространство для других элементов управления в окне, например, кнопок и списков. Как мне это сделать?

Я попытался вставить следующее, но не получилось:

private void setupWindow() { 
    this.frame = new JFrame(WINDOW_TITLE); 
    frame.setSize(width, height); 

    // ** inserted the following: 
    JPanel canvasPanel = new JPanel(new BorderLayout()); 
    canvasPanel.add(canvas); 
    canvasPanel.setSize(30, 40); 
    canvasPanel.setVisible(true); 
    // ** 

    frame.add(canvasPanel); 
    frame.setVisible(true); 

    frame.addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
      System.exit(0); 
     } 
    }); 

    JMenuBar menuBar = new JMenuBar(); 
    JMenu menu = new JMenu("File"); 
    menuBar.add(menu); 
    JMenuItem exitItem = new JMenuItem("Exit"); 
    exitItem.addActionListener(listener); 
    menu.add(exitItem); 
    frame.setJMenuBar(menuBar); 
} 

Это не изменяет внешний вид окна на всех.

Что мне здесь делать? Я не очень хорошо знаком с Java GUI.

Update: Изменение аргумент конструктора из BorderLayout в FlowLayout вызывает GLCanvas исчезнуть.

+0

замените вашего слушателя окна на frame.setDefaultCloseOperation (EXIT_ON_CLOSE) – Syntax

ответ

0

Я предлагаю проверить this guide менеджерам макетов - это даст вам достаточно информации, чтобы узнать, что вы должны попробовать.

1

Ответ от An Anon, вам действительно нужно лучше понять менеджеров компоновки. Ваш вопрос слишком открытый.

В случае, если это помогает, хотя:

JPanel canvasPanel = new JPanel(new BorderLayout()); 
    frame.add(canvasPanel, BorderLayout.CENTER); 

    canvasPanel.add(canvas); 


    Box leftBtnsBox = Box.createVerticalBox(); 
    frame.add(leftBtns, BorderLayout.WEST); 

    leftBtns.add(new JButton("Button 1")); 
    leftBtns.add(new JButton("Button 2")); 

Этот код устанавливает BordeLayout явно, но я думаю, что менеджер расположение по умолчанию для панелей (и панелей контента) является BorderLayout. Этот код поместит две кнопки в верхнюю левую часть панели холста, расположенную вертикально. Поскольку вы используете эти менеджеры макетов, ваш setSize второго кода не имеет никакого эффекта.

+0

1) Я думаю, что лучше настроить макеты явно, так как AFAIR Sun изменил макет по умолчанию контейнеров верхнего уровня от FlowLayout до BorderLayout некоторое время вокруг 1.4. 2) В настоящий момент для JPanels по умолчанию используется FlowLayout. 3) Помимо использования Box для JButtons, OP также может рассмотреть JToolBar. –

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