Динамическое добавление панелей инструментов в Java Swing GUI - PullRequest
0 голосов
/ 06 января 2010

Я занимаюсь разработкой Java-приложения для рабочего стола. В графическом интерфейсе я хочу, чтобы пользователь мог динамически добавлять столько панелей инструментов, сколько ему нужно. Чтобы реализовать это, я уже сделал следующее:

  • Взял mainPanel и установил его макет как BorderLayout
  • Затем взял topPanel и добавил его в BorderLayout mainPanel.NORTH
  • установить макет верхней панели как BoxLayout
  • Затем взяты 5 панелей с именем toolbar1Panel, toolbar2Panel, ....
  • После этого добавьте одну панель инструментов к каждой панели инструментов панели, созданной на предыдущих шагах.
  • Добавлена ​​только одна панель инструментовПанель, т.е. панель инструментов1Панель на верхней панели

Теперь на первой панели инструментов есть кнопка «Добавить», которая добавляется на «панель инструментов1Панель», которая, в свою очередь, добавляется к верхней панели.

Теперь я реализовал метод actionPerformed () вышеупомянутой кнопки «Добавить» следующим образом:

// to add second toolbar Panel to the topPanel dynamically
topPanel.add(toolbar2Panel);  

Но проблема в том, что он не работает. Означает, что панель инструментов не добавлена ​​в верхнюю панель.

Есть ли что-то, чего мне не хватает?

Код генерируется Netbeans, поэтому я думаю, что это только добавит беспорядок для других, поэтому я не вставил сюда никакой код.

Ответы [ 4 ]

3 голосов
/ 06 января 2010

После добавления другой панели инструментов в BoxLayout вам может понадобиться (повторно |) подтвердить панель.

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

topPanel.validate();
topPanel.invalidate();
topPanel.revalidate();
topPanel.layout();

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

2 голосов
/ 06 января 2010

Без указания макета для верхней панели можно предположить, что он неверен.

Добавление к нему двух панелей инструментов может заменить просто первую на вторую или игнорировать вторую.

Просто для тестирования установите макет topPanel в FlowLayout и повторите попытку.

0 голосов
/ 07 января 2010

Это помогает? Это то, чего вы хотите достичь?

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;

public class AddingToolbars {
    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable(){

            public void run() {
                AddingToolbars me = new AddingToolbars();
                me.initGui();

            }

        });

    }

    private JPanel topPanel;
    private JPanel mainPanel;
    private JFrame frame;

    private void initGui() {
        frame = new JFrame();

        mainPanel = new JPanel(new BorderLayout());
        frame.setContentPane(mainPanel);

        topPanel = new JPanel();
        BoxLayout bLayout = new BoxLayout(topPanel,BoxLayout.Y_AXIS);
        topPanel.setLayout(bLayout);
        mainPanel.add(topPanel,BorderLayout.NORTH);

        JButton addButton = new JButton("Add toolbar");
        mainPanel.add(addButton,BorderLayout.CENTER);

        addButton.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {
                addNewToolBar();
            }

        });

        frame.setSize(500,500);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }

    protected void addNewToolBar() {
        JToolBar tb = new JToolBar();
        tb.add(new JButton("b1"));
        tb.add(new JButton("b2"));
        tb.add(new JButton("b3"));

        topPanel.add(tb);
        mainPanel.validate();
    }
}
0 голосов
/ 06 января 2010

Я думаю, вы пытаетесь сделать слишком много перед тестированием. Я хотел бы начать с чего-то очень простого, например с одной панели, одной статической метки. Когда это появится, как вы ожидаете, добавьте панель инструментов с пунктом меню. Это работает. Затем постепенно добавьте кусочки.

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

Альтернативно, в качестве отправной точки зафиксируйте какой-нибудь рабочий пример из сети. Сократите его, а затем доведите до вашего дела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...