0

我试图让我的界面在单击按钮时动态生成自定义按钮。我搜索了几个这样的答案,但不知何故它不起作用。我下面的当前代码有什么错误吗?

  public class MainWindow {

private JFrame frame;
private JPanel panel;
private JPanel panel_1;
private JPanel panel_2;
private JSplitPane splitPane;
private JButton btnSearch;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                MainWindow window = new MainWindow();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public MainWindow() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 645, 438);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel = new JPanel();
    frame.getContentPane().add(panel, BorderLayout.CENTER);
    panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));

    splitPane = new JSplitPane();
    panel.add(splitPane);

    panel_1 = new JPanel();
    splitPane.setLeftComponent(panel_1);

    btnSearch = new JButton("Search");

    GridBagConstraints gbc_btnSearch = new GridBagConstraints();
    gbc_btnSearch.gridx = 0;
    gbc_btnSearch.gridy = 10;
    panel_1.add(btnSearch, gbc_btnSearch);

    panel_2 = new JPanel();
    splitPane.setRightComponent(panel_2);

    btnSearch.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            addButton();
        }
    });
}
protected void addButton() {
    MyButton hahaButton = new MyButton("haha");
    panel_2.add(hahaButton);
    panel_2.add(new JButton());
    panel_2.revalidate();
    panel_2.repaint();
}

这是 MyButton 的定义:

    public class MyButton extends JButton {

private static final long serialVersionUID = 1L;

private Color circleColor = Color.BLACK;

public MyButton(String label) {
    super(label);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    Dimension originalSize = super.getPreferredSize();
    int gap = (int) (originalSize.height * 0.2);
    int x = originalSize.width + gap;
    int y = gap;
    int diameter = originalSize.height - (gap * 2);

    g.setColor(circleColor);
    g.fillOval(x, y, diameter, diameter);
}

@Override
public Dimension getPreferredSize() {
    Dimension size = super.getPreferredSize();
    size.width += size.height;
    return size;
}

}

4

2 回答 2

1

我刚刚尝试了您的源代码,它按预期工作:每次单击拆分窗格左侧的搜索按钮时,面板右侧的面板中都会添加 2 个按钮(一个带有黑色实心圆圈和没有标签的按钮)。

什么不适合你?我在 Mac OSX 上使用 java 1.6,但这也应该适用于其他平台上的早期版本......

于 2012-04-04T19:43:46.470 回答
1

正如 Dieter Rehbein 指出的那样,您拥有的代码确实可以编译和运行。

但是,它相当草率和令人费解,就好像您将不同的来源复制并粘贴在一起一样。

我花了几分钟清理了一些,希望对您有所帮助。

    公共类主窗口
    {
        公共静态无效主要(字符串[] args)
        {
            新的主窗口();
        }

        公共主窗口()
        {
            // 创建分割窗格
            JSplitPane jSplitPane = new JSplitPane();

            最后的 JPanel leftPanel = new JPanel();
            最后的 JPanel rightPanel = new JPanel();

            jSplitPane.setLeftComponent(leftPanel);
            jSplitPane.setRightComponent(rightPanel);

            // 创建按钮
            JButton jButton = new JButton("生成");
            leftPanel.add(jButton);

            jButton.addMouseListener(new MouseAdapter()
            {
                @覆盖
                公共无效鼠标点击(鼠标事件e)
                {
                    添加按钮(右面板);
                }
            });

            // 创建面板
            JPanel jPanel = 新 JPanel();

            jPanel.setLayout(new BoxLayout(jPanel, BoxLayout.X_AXIS));
            jPanel.add(jSplitPane);

            // 创建框架
            JFrame jFrame = new JFrame();

            jFrame.setBounds( 100 , 100 , 645 , 438 );
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.getContentPane().add(jPanel, BorderLayout.CENTER);

            // 显示框架
            jFrame.setVisible(真);
        }

        私人无效添加按钮(JPanel jPanel)
        {
            addButton( jPanel , "默认" , null );
            addButton( jPanel , "红色" , Color.RED );
            addButton( jPanel , "黄色" , Color.YELLOW );
            addButton( jPanel , "蓝色" , Color.BLUE );
            addButton( jPanel , "绿色" , Color.GREEN );
        }

        protected void addButton(JPanel jPanel,字符串标签,颜色颜色)
        {
            jPanel.add(new MyButton(标签,颜色));
            jPanel.revalidate();
            jPanel.repaint();
        }

        公共类 MyButton 扩展了 JButton
        {
            私有静态最终长序列版本UID = 1L;

            私人颜色颜色=空;

            public MyButton(字符串标签,颜色颜色)
            {
                超级(标签);
                this.color = 颜色;
            }

            @覆盖
            受保护的无效paintComponent(图形图形)
            {
                super.paintComponent( 图形 );

                如果(颜色!= null)
                {
                    维度维度 = super.getPreferredSize();

                    整数间隙=(整数)(尺寸.高度* 0.2);
                    int 直径 = 尺寸. 高度 - ( 间隙 * 2 );

                    graphics.setColor( 颜色 );
                    graphics.fillOval(尺寸。宽度+间隙,间隙,直径,直径);
                }
            }

            @覆盖
            公共维度 getPreferredSize()
            {
                维度大小 = super.getPreferredSize();
                尺寸.宽度 += 尺寸.高度;
                返回大小;
            }
        }
    }

于 2012-04-04T20:25:20.697 回答