【问题标题】:JPanel doesn't update when adding Component in another class在另一个类中添加组件时 JPanel 不更新
【发布时间】:2014-09-29 14:10:13
【问题描述】:

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

    公共类 MainPanel 实现 ActionListener{
    JPanel mPanel;
    JToolBar mToolBar;
    JButton addQuestion;
        公共主面板(){
            mPanel = new JPanel(new BorderLayout());
            mToolBar = 新的 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);
    }
    

    }

【问题讨论】:

  • ..setPreferredSize(new Dimension(200, 180)); Swing GUI 可能必须在不同的平台上工作,使用不同的 PLAF,在不同的屏幕尺寸和分辨率上使用不同的字体大小默认设置。因此,它们不利于组件的精确放置。而是使用布局管理器,或 combinations of layout managers 以及 layout padding and borders 用于空白。

标签: java swing jpanel jbutton jtoolbar


【解决方案1】:

您应该重新验证您的面板

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

【讨论】:

    【解决方案2】:

    我相信你需要调用 revalidate() 和 repaint() 才能看到变化,这里有一个类似的问题here

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我认为在这种情况下重绘框架不会有帮助
      猜你喜欢
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 2012-11-26
      • 2015-04-05
      相关资源
      最近更新 更多