如何动态添加新的自定义按钮?

时间:2012-04-04 19:22:24

标签: java swing

我正在尝试让我的界面在单击按钮时动态生成自定义按钮。我搜索了这样的几个答案,但不知何故它不起作用。我目前的代码是否有任何错误?

  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;
}

}

2 个答案:

答案 0 :(得分:1)

我刚刚尝试了你的源代码,它按预期工作:每次我点击分割窗格左侧的搜索按钮,2个按钮被添加到面板右侧的面板上(一个带有黑色填充的面板)圆圈和没有标签的按钮。)

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

答案 1 :(得分:1)

正如Dieter Rehbein所指出的,你所拥有的代码确实可以编译并运行。

然而,它相当邋and和错综复杂,好像你复制并粘贴了不同的来源。

我花了几分钟把它清理干净,希望有所帮助。


    public class MainWindow
    {
        public static void main( String[] args )
        {
            new MainWindow();
        }

        public MainWindow()
        {
            // Create the split pane
            JSplitPane jSplitPane = new JSplitPane();

            final JPanel leftPanel = new JPanel();
            final JPanel rightPanel = new JPanel();

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

            // Create the button
            JButton jButton = new JButton( "Generate" );
            leftPanel.add( jButton );

            jButton.addMouseListener( new MouseAdapter()
            {
                @Override
                public void mouseClicked( MouseEvent e )
                {
                    addButtons( rightPanel );
                }
            } );

            // Create the panel
            JPanel jPanel = new JPanel();

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

            // Create the frame
            JFrame jFrame = new JFrame();

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

            // Show the frame
            jFrame.setVisible( true );
        }

        private void addButtons( JPanel jPanel )
        {
            addButton( jPanel , "Default" , null );
            addButton( jPanel , "Red" , Color.RED );
            addButton( jPanel , "Yellow" , Color.YELLOW );
            addButton( jPanel , "Blue" , Color.BLUE );
            addButton( jPanel , "Green" , Color.GREEN );
        }

        protected void addButton( JPanel jPanel , String label , Color color )
        {
            jPanel.add( new MyButton( label , color ) );
            jPanel.revalidate();
            jPanel.repaint();
        }

        public class MyButton extends JButton
        {
            private static final long serialVersionUID = 1L;

            private Color color = null;

            public MyButton( String label , Color color )
            {
                super( label );
                this.color = color;
            }

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

                if ( color != null )
                {
                    Dimension dimension = super.getPreferredSize();

                    int gap = ( int ) ( dimension.height * 0.2 );
                    int diameter = dimension.height - ( gap * 2 );

                    graphics.setColor( color );
                    graphics.fillOval( dimension.width + gap , gap , diameter , diameter );
                }
            }

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