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