2015-10-05 3 views
1

На данный момент эта программа отображает рамку с кругом в центре. Я попытался добавить JButton в фрейм, чтобы позже реализовать исполнитель действия, чтобы отобразить круг при нажатии, но сейчас у меня проблемы с отображением кнопки. Может ли кто-нибудь сказать мне, как и почему это происходит?Как добавить JButton в JFrame?

import javax.swing.JComponent; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

import java.awt.*; 
import java.awt.geom.*; 

public class SimonShape extends JFrame { 

private JFrame f; 
private JPanel p; 
private JButton b1; 
private JLabel lab; 

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

public SimonShape() { 


    f = new JFrame("Simon Says"); 
    f.setVisible(true); 
    f.setSize(500, 500); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    p = new JPanel(); 
    p.setBackground(Color.GRAY); 

    b1 = new JButton("Click Here to Begin!"); 

    p.add(b1); 
    f.add(p); 
    f.setLocationRelativeTo(null); 


    f.add(new DrawStuff(), BorderLayout.CENTER); 

} 

public class DrawStuff extends JComponent { 

    public void paint(Graphics g) { 

     Graphics2D g2 = (Graphics2D) g; 
     Graphics2D g3 = (Graphics2D) g; 
     Graphics2D g4 = (Graphics2D) g; 
     Graphics2D g5 = (Graphics2D) g; 

     // assume d == 145 && e == 90 

     g2.setPaint(Color.GREEN); 
     g2.fill(new Arc2D.Double(150, 150, 200, 200, 145, 90, Arc2D.PIE)); 

     g3.setPaint(Color.BLUE); 
     g3.fill(new Arc2D.Double(150, 150, 200, 200, 235, 90, Arc2D.PIE)); 

     g4.setPaint(Color.RED); 
     g4.fill(new Arc2D.Double(150, 150, 200, 200, 325, 90, Arc2D.PIE)); 

     g5.setPaint(Color.YELLOW); 
     g5.fill(new Arc2D.Double(150, 150, 200, 200, 55, 90, Arc2D.PIE)); 

    } 

} 

} 
+0

Вызов 'f.setVisible (true);' last. Также убедитесь, что вы инициализируете пользовательский интерфейс из контекста Диспетчерского потока событий, см. [Исходные потоки] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) подробнее – MadProgrammer

ответ

0

Изменить f.add(p); и добавить местоположение для оформления границы. А также переместите ваш вызов setVisible в конец - после добавления всех компонентов.

+1

Я новичок в java swing. Что я должен изменить? –

1

Проблема заключается в том, что вы положили JFrame на экран перед добавлением JButton к нему.

Либо вы можете переместить эту строку f.setVisible(true); на нижнюю (последнюю строку) конструктора.

Или вы можете поместить эту строку f.revalidate(); после добавления всех необходимых компонентов в JFrame.

+0

null int layout - установить рамку в центре экрана, а не в углу. Если я удалю это, как еще я могу установить его в центре? –