Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обход по коллекции.

10K
01 марта 2007 года
ljevik
48 / / 02.10.2006
Проблемма: имеется коллекция свободных векторов. Класс вектор содержит начальную и конечную точки вектора. Как в таком случае (имея н векторов) вывести их на экран????

Класс векторов:
Код:
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;
       
    }
}


У меня даже в цикл не входит :confused:
391
01 марта 2007 года
Archie
562 / / 03.02.2005
А может у тебя коллекция пустая, или index != STAR, или еще чего. Отладчиком воспользуйся.
10K
02 марта 2007 года
ljevik
48 / / 02.10.2006
А так, вообще, логика правильная??

И еще вопрос, у меня коллекция заполняется при выборе в меню пункта "добавить ветор". Но такая проблемма с меню: у меня три панели во фрейме: основная, на ней панель для рисования, и панель с кнопками. Основная панель имеет BorderLayout, панель с кнопками на юге, а панель для рисования посередине. Так вот когда панели для рисования нет, то меню открывается, а когда её создаешь, не открывается, что делать?
391
03 марта 2007 года
Archie
562 / / 03.02.2005
Насчет идеи трудно сказать, т.к. не ясно, что необходимо получить в итоге :).
По поводу меню - покажи код.
10K
03 марта 2007 года
ljevik
48 / / 02.10.2006
Ну, вообщем, задание приблизительно такое: у всех объектов фигур есть начальная точка (задаётся в ходе работы программы), стиль рисования (в ходе работы можно выбирать) и коллекция свободных векторов, которые и рисуются в зависимости от стиля рисования. Стили такие:
-звезда: все вектора имеют общую начальную координату
-ломаная: перый вектор имеет начальную коорд, а начальные координаты остальных являются конечными координатами предыдущих векторов.
-случайно: все, кроме первого вектора, имеют случайную начальную координату.

Рисование должно происходить итерацией по коллекции. Нарисованные фигуры нужно расположить в массив фигур 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);
    }


Спасибо за любую помощь..
391
04 марта 2007 года
Archie
562 / / 03.02.2005
Унаследуй свой Shape от JComponent, а не от Canvas, и с меню все будет Ок :)
10K
04 марта 2007 года
ljevik
48 / / 02.10.2006
да теперь меню работает, но коллекция все равно не заполняется:( Что делать??? Листнер для меню:
Код:
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);
        }
    }
}


сейчас в независимости от введенных координат вылетает MessageDialog!! если new FreeVector(startX,startY,endX,endY); вытащить из try то выдаёт ошибку null пойнтер эксэпшен. Но в обоих случаях по коллекции не проходит и векторы не рисует, как быть????:confused: :confused:
11K
06 марта 2007 года
0ver10PD
45 / / 05.12.2005
Попробуй такой вариант немного более читабельно и фрагменты можна юзать в других стандартных заготовках :)... а дальше развивай мысль :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог