2012-04-04 3 views
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; 
} 

}

+1

Я просто бросил в рот. – mre

+0

Извините ... но я не знаком с программированием качания, не могли бы вы предложить некоторые предложения о том, как это решить? – faz

ответ

1

Я просто попробовал ваш исходный код и он работает, как ожидалось: каждый раз я KLICK кнопку поиска на левой стороне сплит-панель, 2 кнопки добавляются на панель с правой стороны панели (одна с черным заполненным кругом и кнопка без метки).

Что не подходит для вас? Я использую java 1.6 на Mac OSX, но это должно работать и с более ранними версиями на других платформах ...

+0

Я только что узнал .... Мой плохой ...... Я неправильно понял кнопку «Тест/Предварительный просмотр» в WindowsBuilder, он работает ...... Спасибо большое :) – faz

1

Как указал Дитер Рехейн, код, который у вас есть, скомпилирован и запущен.

Однако это было довольно неряшливо и запутанно, как если бы вы копировали и вставляли разные источники вместе.

Я взял несколько минут и очистил их, надеюсь, это поможет.

 

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

Смежные вопросы