Java swing - 重新调整大小时重绘组件(JButtons和JLabel)

pde*_*ean 3 java swing resize duplicates jbutton

我有这个奇怪的问题.我的教授似乎无法复制它,他提供的帮助充其量是最小的.所以说到这一点.此代码在面板上生成JButton并添加到JFrame的内容窗格中:

public myPanel extends JPanel {
    static final long serialVersionUID = 1;
    public myPanel() {
        this.setPreferredSize(new Dimension(600, 40));
    }
    public void paintComponent(Graphics graphicsDrawer) {
        super.paintComponent(graphicsDrawer);
        this.add(new JButton("A Button"));
    }
}
Run Code Online (Sandbox Code Playgroud)

这是GUI代码

public class myGUI {
    public myGUI() {
    }
    public void showGUI() {
        JFrame frame = new JFrame("Issues!!!");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new myPanel());
        frame.pack();
        frame.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后由该类运行GUI

// It is unnecessary to show here but I made a class that
// implements runnable that creates a myGUI object and calls
// showGUI
public static void main(String[] args) {
    RunnableGUI runGUI = new RunnableGUI();
    javax.swing.SwingUtilities.invokeLater(runGUI);
}
Run Code Online (Sandbox Code Playgroud)

这是我的代码裸露的最低限度.但是我已经把它隔离了,即使有了必需品,这个问题仍然存在.下面是我遇到问题的照片.

初始帧带有1个按钮

Vertical Re-size创建额外的按钮

我已经尝试过所有我能找到并想到的东西.

我认为每次重新调整大小时,框架都会重新绘制按钮.但是,由于分配要求,必须能够重新调整框架的大小.

运行Windows 8 w/JRE 7,8(我将下载6但我不认为这会有所帮助)

Hov*_*els 6

永远不要这样做:

public void paintComponent(Graphics graphicsDrawer) {
    super.paintComponent(graphicsDrawer);
    this.add(new JButton("A Button"));  // ***** yikes! ****
}
Run Code Online (Sandbox Code Playgroud)

该方法的paintComponent是画.您不必在是否或者即使它会被称为完全控制,并且它可以被称为的时间,这意味着大量的添加按钮.此外,您希望避免组件创建代码或任何减慢绘制方法中的程序流的代码,因为这些方法部分地决定了GUI的感知响应性,因此您将希望绘制方法(paintpaintComponent)精益,意味着和.

在构造函数或初始化方法中添加按钮,以便控制调用代码的频率.