Компоненты не отображаются в пользовательских JPanel / JComponent - PullRequest
2 голосов
/ 03 июня 2010

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

Справочная информация: я пытаюсь построить дерево видимых объектов, таких как список отображения 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);
        }

    }

}

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

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

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

1 голос
/ 03 июня 2010

Нам было бы проще диагностировать вашу проблему, если бы вы дали нам SSCCE . В настоящее время у нас может не хватить информации для решения вашей проблемы.

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

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

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

Возможно, вам следует прочитать краткое руководство по LayoutManager s . Это может облегчить вам процесс рисования компонентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...