public class FreeVector extends Canvas {
private static final long serialVersionUID = 1L;
Point start;
Point end;
public FreeVector(int startX, int startY, int endX, int endY) {
System.out.println(startX+" "+startY+" "+endX+" "+endY);
start.setLocation(startX, startY);
end.setLocation(endX, endY);
}
public void drawVector(Graphics g) {
g.drawLine((int)start.getX(),(int) start.getY(),(int) end.getX(),(int) end.getY());
}
public Point getEnd() {
return end;
}
public Point getStart() {
return start;
}
Обход по коллекции.
Класс векторов:
Код:
Класс, рисующий вектора, в зависимости от стиля рисования:
Код:
public class Shape extends Canvas {
private static final long serialVersionUID = 1L;
private static final int STAR = 1;
private static final int BROKEN_LINE = 2;
private static final int DEFAULT = 3;
private int index = 0;
Collection<FreeVector> vectors = new ArrayList<FreeVector>();
private int coordinateX = 0;
private int coordinateY = 0;
public Shape() {
setBackground(new Color(200, 200, 200));
}
public void paint(Graphics g) {
if(index == 0) {
g.setColor(new Color(145, 139, 98));
g.setFont(new Font("Arial", Font.ITALIC, 20));
g.drawString("You can now define a search conditions below", 160, 170);
} else {
if(index == STAR) {
g.drawLine(coordinateX, coordinateY, 23, 44);
System.out.println("???");
for (FreeVector vector : vectors) {
System.out.println("!!!");
Point startPoint = vector.getStart();
Point endPoint = vector.getEnd();
System.out.println(startPoint.getX()+" "+startPoint.getY());
g.drawLine((int)startPoint.getX(),(int) startPoint.getY(),(int) endPoint.getX(),(int)endPoint.getY());
}
} else {
if(index == BROKEN_LINE) {
} else {
if(index == DEFAULT) {
}
}
}
}
}
public final void drawShape(int styleIndex, int nodeX, int nodeY) {
this.index = styleIndex;
this.coordinateX = nodeX;
this.coordinateY = nodeY;
}
}
private static final long serialVersionUID = 1L;
private static final int STAR = 1;
private static final int BROKEN_LINE = 2;
private static final int DEFAULT = 3;
private int index = 0;
Collection<FreeVector> vectors = new ArrayList<FreeVector>();
private int coordinateX = 0;
private int coordinateY = 0;
public Shape() {
setBackground(new Color(200, 200, 200));
}
public void paint(Graphics g) {
if(index == 0) {
g.setColor(new Color(145, 139, 98));
g.setFont(new Font("Arial", Font.ITALIC, 20));
g.drawString("You can now define a search conditions below", 160, 170);
} else {
if(index == STAR) {
g.drawLine(coordinateX, coordinateY, 23, 44);
System.out.println("???");
for (FreeVector vector : vectors) {
System.out.println("!!!");
Point startPoint = vector.getStart();
Point endPoint = vector.getEnd();
System.out.println(startPoint.getX()+" "+startPoint.getY());
g.drawLine((int)startPoint.getX(),(int) startPoint.getY(),(int) endPoint.getX(),(int)endPoint.getY());
}
} else {
if(index == BROKEN_LINE) {
} else {
if(index == DEFAULT) {
}
}
}
}
}
public final void drawShape(int styleIndex, int nodeX, int nodeY) {
this.index = styleIndex;
this.coordinateX = nodeX;
this.coordinateY = nodeY;
}
}
У меня даже в цикл не входит :confused:
А может у тебя коллекция пустая, или index != STAR, или еще чего. Отладчиком воспользуйся.
И еще вопрос, у меня коллекция заполняется при выборе в меню пункта "добавить ветор". Но такая проблемма с меню: у меня три панели во фрейме: основная, на ней панель для рисования, и панель с кнопками. Основная панель имеет BorderLayout, панель с кнопками на юге, а панель для рисования посередине. Так вот когда панели для рисования нет, то меню открывается, а когда её создаешь, не открывается, что делать?
По поводу меню - покажи код.
-звезда: все вектора имеют общую начальную координату
-ломаная: перый вектор имеет начальную коорд, а начальные координаты остальных являются конечными координатами предыдущих векторов.
-случайно: все, кроме первого вектора, имеют случайную начальную координату.
Рисование должно происходить итерацией по коллекции. Нарисованные фигуры нужно расположить в массив фигур Shape[]. Затем добавить некоторое количество свободных векторов и снова нарисовать эти фигуры, потом поменять начальную точку и снова нарисовать.
В абстрактном классе Shape метод drawShape() должен быть финальный. И в этом методе должна быть итерация по коллекции векторов, в которой в свою очередь имеется обращение к одному методу другого абстрактного класса someMethod(). (прелагается классовая диаграмма)
С абстрактными классами у меня что-то совсем не выходит, наверно, логика не та...
А по поводу меню, вот код:
Код:
class ShapesViewerFrame extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel bottomPanel, mainPanel;
private JComboBox drawingStyleCombo;
private JTextField nodeCoordinateX;
private JTextField nodeCoordinateY;
JMenuBar menuBar;
Shape shape;
private JButton drawButton;
public ShapesViewerFrame() {
bottomPanel = new JPanel();
mainPanel = new JPanel();
shape = new Shape();
bottomPanel.setBackground(new Color(236, 233, 216));
mainPanel.setLayout(new BorderLayout());
String[] styles = {" ", "Star", "Broken line", "Default"};
drawingStyleCombo = new JComboBox(styles);
nodeCoordinateX = new JTextField(5);
nodeCoordinateY = new JTextField(5);
nodeCoordinateX.setText("0");
nodeCoordinateY.setText("0");
drawButton = new JButton("Draw");
bottomPanel.add(new JLabel("Node X coordinate:"));
bottomPanel.add(nodeCoordinateX);
bottomPanel.add(new JLabel("Node Y coordinate:"));
bottomPanel.add(nodeCoordinateY);
bottomPanel.add(drawingStyleCombo);
bottomPanel.add(drawButton);
drawButton.addActionListener(new DrawButtonListener());
menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu menu = new JMenu("Vectors");
menuBar.add(menu);
JMenuItem addVectorItem = new JMenuItem("Add vector");
menu.add(addVectorItem);
addVectorItem.addActionListener(new NewVectorListener());
menu.addSeparator();
JMenuItem exitItem = new JMenuItem("Exit");
menu.add(exitItem);
exitItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
int paneValue =(int)JOptionPane.showConfirmDialog(null,"Are you shure?","Exit..?",JOptionPane.YES_NO_OPTION);
if(paneValue==0) System.exit(0);
else return;
}
});
mainPanel.add(bottomPanel,BorderLayout.SOUTH);
mainPanel.add(shape, BorderLayout.CENTER);
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
cp.add(mainPanel);
}
private static final long serialVersionUID = 1L;
private JPanel bottomPanel, mainPanel;
private JComboBox drawingStyleCombo;
private JTextField nodeCoordinateX;
private JTextField nodeCoordinateY;
JMenuBar menuBar;
Shape shape;
private JButton drawButton;
public ShapesViewerFrame() {
bottomPanel = new JPanel();
mainPanel = new JPanel();
shape = new Shape();
bottomPanel.setBackground(new Color(236, 233, 216));
mainPanel.setLayout(new BorderLayout());
String[] styles = {" ", "Star", "Broken line", "Default"};
drawingStyleCombo = new JComboBox(styles);
nodeCoordinateX = new JTextField(5);
nodeCoordinateY = new JTextField(5);
nodeCoordinateX.setText("0");
nodeCoordinateY.setText("0");
drawButton = new JButton("Draw");
bottomPanel.add(new JLabel("Node X coordinate:"));
bottomPanel.add(nodeCoordinateX);
bottomPanel.add(new JLabel("Node Y coordinate:"));
bottomPanel.add(nodeCoordinateY);
bottomPanel.add(drawingStyleCombo);
bottomPanel.add(drawButton);
drawButton.addActionListener(new DrawButtonListener());
menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu menu = new JMenu("Vectors");
menuBar.add(menu);
JMenuItem addVectorItem = new JMenuItem("Add vector");
menu.add(addVectorItem);
addVectorItem.addActionListener(new NewVectorListener());
menu.addSeparator();
JMenuItem exitItem = new JMenuItem("Exit");
menu.add(exitItem);
exitItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
int paneValue =(int)JOptionPane.showConfirmDialog(null,"Are you shure?","Exit..?",JOptionPane.YES_NO_OPTION);
if(paneValue==0) System.exit(0);
else return;
}
});
mainPanel.add(bottomPanel,BorderLayout.SOUTH);
mainPanel.add(shape, BorderLayout.CENTER);
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
cp.add(mainPanel);
}
Спасибо за любую помощь..
Унаследуй свой Shape от JComponent, а не от Canvas, и с меню все будет Ок :)
Код:
public class NewVectorListener implements ActionListener {
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 300;
public void actionPerformed(ActionEvent e) {
VectorFrame frame = new VectorFrame();
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(frame);
frame.pack();
} catch (Exception ex) {
System.out.println("Could not load given LookAndFeel!");
System.exit(1);
}
frame.setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
frame.setTitle("Shapes drawer v 1.0");
frame.setResizable(false);
frame.setVisible(true);
}
private class VectorFrame extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel mainPanel;
private JButton addVectorButton;
private JTextField vectorStartCoordinateX;
private JTextField vectorStartCoordinateY;
private JTextField vectorEndCoordinateX;
private JTextField vectorEndCoordinateY;
public VectorFrame() {
mainPanel = new JPanel();
//mainPanel.setLayout(new BorderLayout());
vectorStartCoordinateX = new JTextField(5);
vectorStartCoordinateY = new JTextField(5);
vectorEndCoordinateX = new JTextField(5);
vectorEndCoordinateY = new JTextField(5);
addVectorButton = new JButton("Add vector");
vectorStartCoordinateX.setText("0");
vectorStartCoordinateY.setText("0");
vectorEndCoordinateX.setText("0");
vectorEndCoordinateY.setText("0");
mainPanel.add(vectorStartCoordinateX);
mainPanel.add(vectorStartCoordinateY);
mainPanel.add(vectorEndCoordinateX);
mainPanel.add(vectorEndCoordinateY);
mainPanel.add(addVectorButton);
addVectorButton.addActionListener(new ActionListener(){
private int startX = 0;
private int startY = 0;
private int endX = 0;
private int endY = 0;
public void actionPerformed(ActionEvent event) {
try {
startX = Integer.parseInt(vectorStartCoordinateX.getText().toString());
startY = Integer.parseInt(vectorStartCoordinateY.getText().toString());
endX = Integer.parseInt(vectorEndCoordinateX.getText().toString());
endY = Integer.parseInt(vectorEndCoordinateY.getText().toString());
new FreeVector(startX,startY,endX,endY);
} catch(Exception e) {
JOptionPane.showMessageDialog(null,"Inserted coordinates are not integers!","Error!",JOptionPane.WARNING_MESSAGE);
return;
}
}
});
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
cp.add(mainPanel);
}
}
}
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 300;
public void actionPerformed(ActionEvent e) {
VectorFrame frame = new VectorFrame();
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(frame);
frame.pack();
} catch (Exception ex) {
System.out.println("Could not load given LookAndFeel!");
System.exit(1);
}
frame.setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
frame.setTitle("Shapes drawer v 1.0");
frame.setResizable(false);
frame.setVisible(true);
}
private class VectorFrame extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel mainPanel;
private JButton addVectorButton;
private JTextField vectorStartCoordinateX;
private JTextField vectorStartCoordinateY;
private JTextField vectorEndCoordinateX;
private JTextField vectorEndCoordinateY;
public VectorFrame() {
mainPanel = new JPanel();
//mainPanel.setLayout(new BorderLayout());
vectorStartCoordinateX = new JTextField(5);
vectorStartCoordinateY = new JTextField(5);
vectorEndCoordinateX = new JTextField(5);
vectorEndCoordinateY = new JTextField(5);
addVectorButton = new JButton("Add vector");
vectorStartCoordinateX.setText("0");
vectorStartCoordinateY.setText("0");
vectorEndCoordinateX.setText("0");
vectorEndCoordinateY.setText("0");
mainPanel.add(vectorStartCoordinateX);
mainPanel.add(vectorStartCoordinateY);
mainPanel.add(vectorEndCoordinateX);
mainPanel.add(vectorEndCoordinateY);
mainPanel.add(addVectorButton);
addVectorButton.addActionListener(new ActionListener(){
private int startX = 0;
private int startY = 0;
private int endX = 0;
private int endY = 0;
public void actionPerformed(ActionEvent event) {
try {
startX = Integer.parseInt(vectorStartCoordinateX.getText().toString());
startY = Integer.parseInt(vectorStartCoordinateY.getText().toString());
endX = Integer.parseInt(vectorEndCoordinateX.getText().toString());
endY = Integer.parseInt(vectorEndCoordinateY.getText().toString());
new FreeVector(startX,startY,endX,endY);
} catch(Exception e) {
JOptionPane.showMessageDialog(null,"Inserted coordinates are not integers!","Error!",JOptionPane.WARNING_MESSAGE);
return;
}
}
});
Container cp = getContentPane();
cp.setLayout(new BorderLayout());
cp.add(mainPanel);
}
}
}
сейчас в независимости от введенных координат вылетает MessageDialog!! если new FreeVector(startX,startY,endX,endY); вытащить из try то выдаёт ошибку null пойнтер эксэпшен. Но в обоих случаях по коллекции не проходит и векторы не рисует, как быть????:confused: :confused:
Попробуй такой вариант немного более читабельно и фрагменты можна юзать в других стандартных заготовках :)... а дальше развивай мысль :)