Простой пользовательский Swing JComponent всегда плоский - PullRequest
1 голос
/ 13 сентября 2011

Я просто играю с Swing и работаю над очень простым компонентом Swing. У меня есть компонент, унаследованный от JComponent класса и его пользовательский интерфейс унаследован от ComponentUI. Метод paint() выглядит следующим образом:

public void paint(Graphics g, JComponent c) {
    int x = c.getX();
    int y = c.getY();
    c.setBounds(x, y, 100, 25);
    int width = c.getWidth();
    int height = c.getHeight();
    Rectangle r = g.getClipBounds();
    g.fillRect(0, 0, 10, 10);
    g.drawString("Baf!", 3, 3);
}

Но совершенно невозможно получить другое значение r.height, чем 1. Компонент имеет заданную ширину, но всегда высоту только в одну точку. Кто-нибудь еще сталкивался с такими компонентами? К сожалению, нет простого учебника. Все учебники непостижимо сложны (или устарели).

Кажется, что менеджер компоновки изменяет размер этого компонента всегда до 1 высоты (независимо от минимального значения).

Ответы [ 2 ]

5 голосов
/ 13 сентября 2011

Никогда не вызывайте setBound () в методе рисования. Это работа менеджера по макету, а не код рисования.

Я бы предположил, что главная проблема (кроме очков Гейзенбага) в том, что вы не даете компоненту размер. Это делается путем переопределения getPreferredSize () для возврата размера, соответствующего вашему компоненту.

Прочтите раздел из учебника по Swing на Custom Painting для получения дополнительной информации и рабочих примеров.

5 голосов
/ 13 сентября 2011

Есть несколько проблем с вашим кодом:

Что касается расширения класса JComponent:

  1. public void paint(Graphics g, JComponent c) {}

    не являетсядействительная подпись, поэтому вы не переопределяете метод paint, но создаете новый метод рисования.

  2. вы должны переопределить метод paintComponent (Graphics g) вместо рисования.

  3. Поскольку вы расширяете JComponent, вам необходимо сначала вызвать super.paintComponent (g) внутри вашего переопределенного метода paintComponent:

    public class JPanelExtended{ public void paintComponent(Graphics g){ super.paintComponent(g); ... } }

ДляЧто касается класса, расширяющего ComponentUI, вам даже следует явно вызвать метод paint для суперкласса:

public void paint(Graphics g, JComponent c) {
    super.paint(g,c);
}

EDIT: небольшое предложение: когда вы хотите переопределить метод, весьма полезно поместить@ override нотация перед подписью:

@Override
public void superMethodToBeOverridden(){}

Таким образом компилятор уведомит вас об ошибке, если вы определяете новый метод, а не переопределяете существующий.

...