2016-05-08 2 views
-1

Я пытаюсь создать панель, содержащую фигуру и кнопку. Проблема в том, что когда я добавляю кнопку в JPanel, форма не появляется. Он просто показывает кнопку в верхней части экрана. Квадрат появляется только при добавлении квадрата к кадру вместо панели, но кнопка не появляется.Форма не появится, когда я добавляю JButton в JPanel

public static void main(String[] args) 
{ 
    JFrame frame = new JFrame(); 
    JPanel panel = new JPanel(); 
    //Replace FRAME_WIDTH/HEIGHT with a number greater than 100 
    frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
    frame.setTitle("Square Game"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //Creates a Red Square from RedSquare 
    final RedSquare red = new RedSquare(); 
    panel.add(red); 

    JButton button = new JButton(); 
    button.setText("Red"); 
    panel.add(button); 

    frame.add(panel); 

    frame.setVisible(true); 

} 

public class RedSquare extends JComponent 
{ 
private Square sq; 
private int x = 100; 
private int y = 0; 
private Graphics2D g2; 

public RedSquare() 
{ 
    sq = new Square(x,y,Color.red); 
} 

public void paintComponent(Graphics g) 
{ 
    Graphics2D g2 = (Graphics2D) g; 
    sq.draw(g2); 
} 

public int getX() 
{ 
    return x; 
} 

public int getY() 
{ 
    return y; 
} 

public void moveBy() 
{ 
    y++; 
    sq = new Square(x,y,Color.red); 
    repaint(); 
} 
} 

public class Square 
{ 
private int x; 
private int y; 
private Color color; 

public Square(int x, int y, Color color) 
{ 
    this.x = x; 
    this.y = y; 
    this.color = color; 
} 

public void draw(Graphics2D g2) 
{ 
    Rectangle body = new Rectangle(x, y, 40, 40); 
    g2.draw(body); 
    g2.setPaint(color); 
    g2.fill(body); 
    g2.draw(body); 
} 
} 

Нужно ли мне что-то делать, чтобы сделать эту работу? Я что-то упускаю? Я новичок в этом, и любая помощь очень ценится.

+0

Да. Сделайте JPanel для JButton и создайте отдельную панель чертежей из другого JPanel. –

+0

Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). Похоже, что 'RedSquare' является' JComponent', а не просто графическим объектом. Это означало бы, что он не может быть «сложен» так, как вам кажется. –

+1

О, теперь я вижу, что они добавляются в 'FlowLayout' ..« RedSquare »переопределяет метод getPreferredSize()? О, неважно .. MCVE расскажет все (мы должны знать). –

ответ

0

Я думаю, что вам нужно установить макет панели с помощью panel.setLayout (новый FlowLayout()); перед добавлением чего-либо в панель, чтобы он отображал ваши обе формы. Сейчас это переопределение.

0

При добавлении компонентов в JFrame попробуйте использовать setContentPane вместо добавления. Поэтому из вашего примера выше удалите frame.add(panel); и используйте frame.setContentPane(panel);

0

Необычно, что вы распространяете JComponent, который является абстрактным, хотя и не запрещенным.

Одним из решений является использование JPanel вместо JComponent.

А также установив координату x в x = 0, вы увидите квадрат.

Помимо этого вы можете использовать макет т.д.,:

panel.setLayout(new BorderLayout()); 

.... 


panel.add("Center", red); 


....... 

panel.add("South", button); 
Смежные вопросы