2010-06-03 3 views
2

Я создал пользовательский компонент swing. Я вижу это (сетка из метода рисования рисуется), но кнопки, которые добавлены (проверены с помощью println), не отображаются. Что я делаю не так?Компоненты не отображаются в пользовательских JPanel/JComponent

Фоновая информация: Я пытаюсь создать дерево видимых объектов, таких как список отображения Flash/AS3.

public class MapPanel extends JComponent { // or extends JPanel, same effect 

    private static final long serialVersionUID = 4844990579260312742L; 

    public MapPanel(ShapeMap map) { 
     setBackground(Color.LIGHT_GRAY); 
     setPreferredSize(new Dimension(1000,1000)); 
     setLayout(null); 
     for (Layer l : map.getLayers()) { 
//   LayerView layerView = new LayerView(l); 
//   add(layerView); 
      System.out.println(l); 
      JButton test = new JButton(l.getName()); 
      add(test); 
      validate(); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 

     // necessary? 
     super.paintComponent(g); 

     // background 
     g.setColor(getBackground()); 
     g.fillRect(0, 0, getWidth(), getHeight()); 

     // grid 
     g.setColor(Color.GRAY);   
     for (double x = 0; x < getWidth(); x += 10) { 
      g.drawLine((int)x, 0, (int)x, getHeight()); 
     } 
     for (double y = 0; y < getHeight(); y += 10) { 
      g.drawLine(0, (int)y, getWidth(), (int)y); 
     } 

    } 

} 
+1

Кстати, super.paintComponent() не требуется, так как ваш код полностью заполняет фон методом fillRect(). Также в случае JComponent отсутствует код по умолчанию для рисования для метода paintComponent(). Однако в целом рекомендуется вызвать метод paintComponent(), если у вас нет особых причин не делать этого. – camickr

ответ

2

Установка нуля в качестве менеджера компоновки, а затем добавление кнопок не будет иметь никакого эффекта. Менеджер компоновки отвечает за вычисление границ дочерних компонентов, а установка менеджера макета с нулевым эффектом оставляет все ваши кнопки с ограничениями = (0,0,0,0).

Попробуйте вызвать test.setBounds (10, 10, 50, 20) в качестве быстрого теста, чтобы увидеть, отображаются ли кнопки. Если они это сделают, они будут показаны точно в одном месте. Оттуда вы можете установить собственный менеджер компоновки, который дает каждой кнопке требуемые границы или использует один из менеджеров макетов/сторонних макетов.

+0

О, я ошибочно предположил, что кнопки будут помещены в 0,0 с разумным размером по умолчанию. Не угадайте: p setBounds заставили их появиться. следующий шаг: замена кнопки на мои собственные компоненты –

1

Было бы легче для нас, чтобы диагностировать проблему, если вы дали нам SSCCE. Как бы то ни было, у нас может не хватить информации, чтобы исправить вашу проблему.

Я могу видеть его (сетки от метода краски втягивается),

Я не знаю, что это значит, не существует никакого метода краски() в размещенном коде. (Но, я полагаю, достаточно легко предположить, что вы имели в виду paintComponent(g))

Однако, похоже, проблема в том, что вы являетесь «нулевым макетом». Дети не будут рисовать, если вы вручную не установили размер и расположение детей.

Возможно, вы должны прочитать быстрый учебник по LayoutManagers. Это может облегчить вам задачу при рисовании компонентов.

+1

«Нулевой» макет, вероятно, является проблемой, но для остальных данный код и объяснение на мой взгляд достаточно для диагностики, даже без его запуска. Я добавлю +1, если вы немного облегчите последнюю часть, которая может показаться немного снисходительной. Я думаю, что жалобы на качество вопроса должны оставаться в комментариях. – Gnoupi

+0

@Gnoupi Согласен! (со всем этим) – jjnguy

+0

Когда я разместил там, где еще два ответа, которые с тех пор были удалены, потому что они не соответствуют теме. Это говорит мне, что вопрос может быть не таким полным, как вы думаете. По определению при задании вопроса ОП не знает, где проблема, и поэтому не знает, включена ли вся необходимая информация. Вот почему SSCCE должен быть опубликован с каждым вопросом. Да, иногда мы можем правильно догадаться. Однако, в общем, людям нужно тратить больше времени, чтобы вопрос был ясным и кратким, поэтому мы не тратим время на угадывание и принятие. – camickr

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