2015-03-15 3 views
0

Im пытаюсь представить заданную математическую функцию внутри JPanel, пока что я просто имею ось, но ось не рисует, и я не знаю, почему, кстати, если я позвоню new Axis() внутри рамки, делает краска.Картина внутри JPanel

Основной класс

public class MyClass{ 

final static int HEIGHT = 400; 
final static int WIDTH = 400; 

public static void main(String[] args) { 

    JFrame frame = new JFrame(); 
    frame.setSize(WIDTH,HEIGHT); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    setPanel(frame); 

    frame.setVisible(true); 
} 

static void setPanel(JFrame frame) { 
    JPanel panel = new JPanel(); 

    panel.setBackground(Color.GRAY); 
    panel.add(new Axis()); 

    frame.add(panel); 
} 

} 

Ось класса

@SuppressWarnings("serial") 
public class Axis extends JComponent{ 
static final int LONG_AXIS = 150; 

public void paintComponent(Graphics g) { 

    int CenterX = getWidth()/2; 
    int CenterY = getHeight()/2; 

    g.setColor(Color.BLACK); 

    //x axis line 
    g.drawLine(CenterX - LONG_AXIS, CenterY, CenterX + LONG_AXIS, CenterY); 

    //y axis line 
    g.drawLine(CenterX, CenterY - LONG_AXIS, CenterX, CenterY + LONG_AXIS); 

} 


} 

Другой вопрос: Можно ли иметь несколько методов краски?

+0

BTW некоторые плохие практики: (1) код свинг не работает на Событие Dispatch Thread (2) не соответствует соглашению об именах (например, int CenterX) (3) предпочтительным является «статический окончательный» (4) метод статического сеттера не рекомендуется - вместо этого расширяет JFrame – tony200910041

+0

Согласитесь со всеми этими состояниями @ tony200910041, отличными от '' extends JFrame ''бит. Вы можете рисовать себя в углу, если ваш класс расширяет JFrame, заставляя вас создавать и отображать JFrames, когда требуется больше гибкости. Чаще всего ваши классы GUI должны быть ориентированы на создание JPanels, которые затем могут быть помещены в JFrames или JDialogs или JTabbedPanes или заменены через CardLayouts, где это необходимо. Это значительно повысит гибкость вашего графического интерфейса. –

ответ

2

При запуске проверьте размер объекта Axis, и вы, вероятно, обнаружите, что он имеет размер [0, 0] или [1, 1], так как вы добавляете его в JPanel, который использует FlowLayout by по умолчанию, и поэтому не приведет к расширению оси, и предпочтительный размер по умолчанию для Axis равен [0, 0].

Рассмотрите возможность переопределения метода getPreferredSize() компонента Axis для возврата разумного размера или его использования JPanel используйте BorderLayout и добавьте его BorderLayout.CENTER или выполните оба действия.

Кроме того, не забудьте вызвать метод paintComponent супер в вашем переопределении.


Что касается,

Хорошо, я имею в виду, если его хорошая практика, например, один метод краски для оси, а другой метод краски, чтобы сделать функцию Жеребьевка по математике

Рассмотрите возможность создания методов, которые paintComponent(...) требует для каждого из этих шагов. Если вы сложны, вы можете делегировать его некомпонентным объектам, которые удерживает ваш компонент чертежа, и снова рисовать комкомненты.

Кроме того, статические части вашего изображения, то есть, оси х и у-х лучше всего обращается к BufferedImage, который затем обращается в paintComponent через g.drawImage(....)

+0

Хорошо, я имею в виду, если это хорошая практика, например, один метод рисования для оси и другой метод рисования для выполнения математической функции рисования – Frank

+0

@Frankovich: см. Править. –

+0

Хорошо, спасибо за совет :) – Frank

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