JPanel не обновляется при добавлении компонента в другой класс

Я новичок в Java Swing, и у меня есть несколько проблем.

  1. В качестве побочного вопроса, как лучше всего разделить код при создании довольно большого приложения Java Swing? В моем случае я хочу иметь приложение с макетом, как в Microsoft Word, где есть панель JToolBar, заполненная кнопками, и основная панель JPanel, в которой изменения вносятся на основе кнопок, нажатых на панели инструментов.
  2. Итак, как показано в приведенном ниже коде, у меня есть JFrame, и я вызываю класс MainPanel, чтобы создать панель и добавить ToolBar с помощью кнопки. Когда кнопка нажата, она добавляет кнопку на панель. Проблема возникает, когда вы нажимаете кнопку, ничего не отображается, пока вы не измените размер окна (в моем случае я просто вручную перетаскиваю экран, чтобы увеличить его).

    public class Main {
    
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("MathMaker");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        //Create the menu bar.  Make it have a green background.
        //MainToolBar mainTB = new MainToolBar();
        MainPanel mainPanel = new MainPanel();
    
        frame.getContentPane().add(mainPanel.getGUI(), BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }
    
    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
    
    }
    

    public class MainPanel implements ActionListener{
    JPanel mPanel;
    JToolBar mToolBar;
    JButton addQuestion;
        public MainPanel() {
            mPanel = new JPanel(new BorderLayout());
            mToolBar = new JToolBar();
            addQuestion = new JButton("test");

    addQuestion.addActionListener(this); mPanel.setLayout(new BorderLayout()); mPanel.setBackground(new Color(248, 213, 131)); mPanel.setPreferredSize(new Dimension(200, 180)); mToolBar.add(addQuestion); mPanel.add(mToolBar, BorderLayout.PAGE_START); } public JComponent getGUI() { return mPanel; } @Override public void actionPerformed(ActionEvent e) { JButton temp = new JButton("temp"); mPanel.add(temp); }

    }


person Toast    schedule 06.08.2014    source источник
comment
..setPreferredSize(new Dimension(200, 180)); Графические интерфейсы пользователя Swing могут работать на разных платформах, используя разные PLAF, на экранах разных размеров и разрешений с разными настройками по умолчанию для размера шрифта. Как таковые, они не способствуют точному размещению компонентов. Вместо этого используйте менеджеры компоновки или комбинации менеджеров компоновки, а также отступы макета и границы для пустого пространства.   -  person Andrew Thompson    schedule 07.08.2014


Ответы (3)


Вам следует повторно подтвердить свою панель

@Override
public void actionPerformed(ActionEvent e) {
   JButton temp = new JButton("temp");
   mPanel.add(temp);
   mPanel.revalidate();
   mPanel.repaint();
}
person Sergiy Medvynskyy    schedule 06.08.2014

Я считаю, что вам нужно вызвать revalidate () и repaint (), чтобы увидеть изменения, вот аналогичный вопрос здесь

person Adam    schedule 06.08.2014

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

Просто вызовите методы validate () и repaint () с панелью

person capt.swag    schedule 06.08.2014
comment
Не думаю, что перекраска рамы поможет в этом случае - person msrd0; 06.08.2014