2013-07-12 2 views
1

Вот мой простой код, который рисует прямоугольник на фрейме. Как я могу добавить кнопку в этот кадр? Я попытался установить FlowLayout, но затем прямоугольник не виден. Помогите пожалуйста.Добавление JButton и прямоугольника в JFrame

import java.awt.*; 
import javax.swing.*; 

public class test extends Canvas{ 
public static JFrame frame; 
public static JButton button; 

public void paint(Graphics graphics) { 
    graphics.setColor(Color.yellow); 
    graphics.fillRect(10, 10, 100, 100); 
    graphics.setColor(Color.red); 
    graphics.drawRect(10, 10, 100, 100); 
} 

public static void main(String args[]){ 
    test x=new test(); 
    frame=new JFrame(); 
    button=new JButton(); 

    button.setSize(20,20); 
    button.setText("Click"); 

    frame.setSize(500,500); 
    frame.add(button); 
    frame.add(x); 
    frame.setVisible(true);  
} 
} 
+0

Что вы видите? О каком прямоугольнике вы имеете в виду? – mattbdean

+0

Вы пытались установить предпочтительный размер в «тесте?»? – resueman

+2

Вы пытались вызвать 'super.paint (graphics)' в вашем методе 'paint'? – martijno

ответ

2

Стандарт по умолчанию для JFrame: BorderLayout, который может принимать только один компонент на ограничение компоновки. По умолчанию, когда ни один не указан, CENTER. Меняем:

frame.add(button); 
frame.add(x); 

To:

frame.add(button, BorderLayout.PAGE_START); 
frame.add(x); 

И вы должны увидеть оба компонента.

Другие советы:

  1. Не установлены размеры контейнеров верхнего уровня. Вместо этого разместите контент & наберите pack().
  2. Не смешивайте Swing & AWT без уважительной причины. Как упоминалось в другом плакате, мы обычно использовали JPanel для пользовательского рендеринга в Swing.
  3. BorderLayout будет игнорировать размер кнопки и растянуть ее, чтобы она поместилась. Чтобы он оставался определенного размера, установите предпочтительный размер и добавьте его в FlowLayout. Добавьте FlowLayout в ограничение PAGE_START.
+0

+1 для предложений. '" установить предпочтительный размер "' !!! Выглядит странно, когда вы тот, кто предлагает эту штуку ... –

+3

@nIcEcOw Я .. не совсем убежден в аргументе «никогда не задавайте предпочтительный размер». Кажется, что это предотвращает использование некоторых компонентов (например, JTextPane' и 'JEditorPane'), которые не имеют размера по умолчанию, и выявляют проблемы с другими при помещении в контейнер (например,' JComboBox' в 'JToolBar'). Клеопатра с радостью сообщит нам использовать сторонний макет, но я придерживаюсь только JSE, который обычно не позволяет устанавливать размеры. Скажем так. Я очень осторожен, чтобы предложить его, но в таких случаях, как это сделать в компоненте, я бы использовал его для этого компонента. (Но не говорите K ..;) –

+1

LOL :-), конечно, не буду. Да, верно об этих компонентах, даже с «JTable», к которым я прикреплен, теперь дни, читающие учебники, и все они используют этот метод, время от времени даже в Java Docs, поэтому было немного озадачено тем, чему верить и что не для :-). –

2

Не нарисовать на Canvas. Нарисуйте на JPanel.

Сделайте свой класс расширенным JPanel, а затем переопределите paintComponent(Graphics g). Не забудьте позвонить по телефону super.paintComponent()!

0

Вы должны использовать Контейнер, получить Контейнер кадра, а затем использовать макеты и добавлять к нему компоненты с помощью метода add().

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