首页 文章

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

提问于
浏览
4

我是Java Swing的新手,我遇到了一些问题 .

  • 作为一个附带问题,在制作相当大的Java Swing应用程序时,分割代码的最佳方法是什么?在我的情况下,我希望有一个应用程序,其布局就像Microsoft Word一样,其中有一个填充了按钮的JToolBar和一个主JPanel,其中根据工具栏中按下的按钮进行更改 .

  • 因此,如下面的代码所示,我有一个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 回答

  • 3

    您应该重新验证您的面板

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

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

  • 3

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

    只需使用面板调用validate()和repaint()方法即可

相关问题