2014-09-18 2 views
9

У меня очень простая проблема. Я изучаю Java и получил задание нарисовать машину. Я сделал это все в одном классе, который расширяет JPanel, и сделал рисунок в пределах paintComponent().Нарисуйте колесо автомобиля

Я понимаю, что это плохое объектно-ориентированное программирование, и решил попытаться подклассифицировать некоторые части, чтобы исправить эту ситуацию.

Я попытался создать класс, который рисует колеса, но не увенчался успехом.

По сути, я хотел бы быть в состоянии сделать это:

Main Class extends JPanel 

paintComponent{ 
     Wheel leftWheel = new Wheel(0, 50, 100); 
     this.add(leftWheel); 
} 

Это должно сделать колесо в точке (0, 50) в рамках JPanel, и имеют диаметр 100.

Тем не менее, я не уверен, как я должен контролировать позиционирование в JPanel. Когда я это сделаю, колесо нарисовано в верхней части моего окна. Это то, что выглядит мой класс колеса, как:

public class Wheel extends JComponent { 

private int x, y, diameter; 
private boolean clockwise; 

Wheel(int x, int y, int size, boolean cw) 
{ 
    this.setPreferredSize(new Dimension(size, size)); 
    this.x = x; 
    this.y = y; 
    diameter = size; 
    clockwise = cw; 
    repaint(); 
} 

public void paintComponent(Graphics canvas) 
{ 
    super.paintComponent(canvas); 
    canvas.setColor(Color.gray); 
    canvas.fillOval(x,y,diameter,diameter); 
} 

} 

х и у должны быть там, где он появляется на родительское окно, однако, это не так, в следующем коде (находится в родительском классе, который расширяет JFrame):

Wheel leftWheel = new Wheel(0,0,WHEEL_DIAMETER,true); 
this.add(leftWheel); 

колесо не тянет в левом верхнем углу моего окна, он рисует в центре моего окна в верхней части. Я что-то делаю неправильно? Извините, если я не следую некоторым соглашениям Java, у меня пока нет опыта. Является ли это тем, как я должен обращаться с рисунком колеса, или существует ли более приемлемая практика для этого типа рисунка?

К примеру, в моем JPanel классе, если добавить следующий код:

Wheel x = new Wheel(50,60,75,true); 
this.add(x); 

я кадр размером 75x75, в которой колесо (размер 75x75) рисуется в точке (50,60) в пределах , что кадр, а не внутри родительской системы координат JPanel. В результате получается круг, который обрезается, и я вижу только верхний левый угол круга. Это изображение отображается в верхней части моего JPanel

Я понимаю, как нарисовать колесо и переместить его внутри себя, но как поместить колесо на JPanel?

+1

С точки зрения инкапсуляции я переместил логику позиционирования полностью за пределы класса «Колесо». Это бизнес класса, который собирает автомобиль, чтобы «установить» колесо в правильном положении. – 5gon12eder

+0

Согласен. Как я могу управлять позиционированием в родительском классе? Вот чего я не понимаю. Я не знаком с Java и синтаксисом. –

+1

Вы можете использовать перегруженный метод 'add', который принимает объект ограничений для управления позиционированием. Как вы это сделаете, это точно зависит от ['LayoutManager'] (https://docs.oracle.com/javase/7/docs/api/java/awt/LayoutManager.html), который вы используете. – 5gon12eder

ответ

3

Не могли бы вы объяснить, как контролировать его местоположение внутри JPanel, а не внутри себя, пожалуйста?

По умолчанию LayoutManager для JPanel является FlowLayout, поэтому компонент всегда будет располагаться на основе правил диспетчера компоновки.

Если вы хотите добавить компоненты в случайное местоположение, вам нужно использовать нулевой макет. Но когда вы используете нулевой макет, вы тогда отвечаете за настройку размера и местоположения компонента. Таким образом, на самом деле обычная картина всегда должна выполняться в (0, 0) в пользовательском компоненте.

+0

Мне нужно было установить макет JPanel равным нулю, а затем использовать wheel.setBounds (координаты) для местоположения. Благодаря! –

6

Ваш конструктор имеет небольшую ошибку,

Wheel(int x, int y, int size, boolean cw) { 
    this.setPreferredSize(new Dimension(size, size)); 
    diameter = size; 
    clockwise = cw; 
    repaint(); 
} 

Вы забыли хранить x и y. Я думаю, что вы хотели,

Wheel(int x, int y, int size, boolean cw) { 
    this.x = x; 
    this.y = y; 
    this.setPreferredSize(new Dimension(size, size)); 
    diameter = size; 
    clockwise = cw; 
    repaint(); 
} 

Потому что ваш x и y равны 0, если вы не установите их.

+0

Хммм, я добавил строки, которые забыл, но теперь колесо не нарисовано вообще. Я не изменил никакого другого кода. –

+0

@JosueEspinosa Возможно, вы должны убедиться, что x и y не находятся за краем вашего окна. –

+0

Да, это было, но координаты, в которых колесо нарисовано в собственном окне, а не на родителя. Не могли бы вы объяснить, как контролировать его местоположение внутри JPanel, а не внутри себя, пожалуйста? –

0

Вместо добавления нескольких JPanels для создания транспортного средства я бы просто использовал один класс, который расширяет JPanel и создает несколько методов для создания таких вещей, как колеса и т. Д., Которые вызывается из переопределенного метода paintComponent. Вы можете передать новый метод ссылке вашего графического объекта, создать копию вашего графического объекта с помощью g.create() или использовать getGraphics() внутри самого метода. Внутри метода создания колеса вы можете вычислить его положение, используя размеры панели и правильно разместите ее.

Альтернативой было бы определить и вернуть фигуры в других методах и просто нарисовать их с использованием графического объекта в paintComponent().

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