在另一个类中添加Component时,JPanel不会更新

时间:2014-08-06 15:03:21

标签: java swing jpanel jbutton jtoolbar

我是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); }

    }

3 个答案:

答案 0 :(得分:7)

您应该重新验证面板

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

答案 1 :(得分:3)

我相信你需要调用revalidate()和repaint()来查看更改,这里是一个类似的问题here

答案 2 :(得分:3)

这里的问题是面板没有自动重新绘制..当您调整面板大小时,Java重新绘制屏幕上的面板。每次点击修改面板的任何按钮时,尝试重新绘制面板。

只需使用面板

调用validate()和repaint()方法即可