4

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

    }

4

3 回答 3

10

您应该重新验证您的面板

@Override
public void actionPerformed(ActionEvent e) {
   JButton temp = new JButton("temp");
   mPanel.add(temp);
   mPanel.revalidate();
   mPanel.repaint();
}
于 2014-08-06T15:08:56.743 回答
3

我相信您需要调用 revalidate() 和 repaint() 才能看到更改,这里有一个类似的问题

于 2014-08-06T15:07:41.540 回答
3

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

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

于 2014-08-06T15:08:20.717 回答