Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2014, 14:07   #1
Aerowalk
Пользователь
 
Регистрация: 27.10.2008
Сообщений: 15
По умолчанию Рисование (JAVA)

Здравствуйте, программисты. Помогите, пожалуйста, как нарисовать точку на экране и как задать её цвет? хотелось бы видеть нечто вроде Integer.parseInt() только для цвета, иначе не придумал ничего как посылать 255,255,255 поочередно((
Вот код:
"Engine.java"
Код:
import java.awt.*;                  //так нехорошо, известно
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.*;  //так тоже
 
public class Engine {
    static int a,b;
    static Color c;
 
    public static void createGUI() {
        
        JFrame frame = new JFrame("GRAPHICS");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JMenuBar menuBar = new JMenuBar();
        
        JMenu mainMenu = new JMenu("Menu");
        JMenu newMenu = new JMenu("Set");
        mainMenu.add(newMenu);
 
        JMenuItem pointItem = new JMenuItem("Point");
        newMenu.add(pointItem);
        
        pointItem.addActionListener(new ActionListener() {           
            public void actionPerformed(ActionEvent e) {
                 String str_positionX = JOptionPane.showInputDialog("Position X of the point");
                 String str_positionY = JOptionPane.showInputDialog("Position Y of the point");
                 String str_color = JOptionPane.showInputDialog("Color of the point");
                 a = Integer.parseInt(str_positionX);
                 b = Integer.parseInt(str_positionY);
                 c = Color.getColor(str_color);                     //выполнится ли если напишу "Black"?
///////////////////////////////////////////////////////////////
                 Point newPoint = new Point(a,b,c);       
                 //frame.add(new Point(500,500,c));            //неработающий вариант  
///////////////////////////////////////////////////////////////
            }           
        });
         
        JMenuItem segmentItem = new JMenuItem("Segment");
        newMenu.add(segmentItem);
         
        JMenuItem rectangleItem = new JMenuItem("Rectangle");
        newMenu.add(rectangleItem);
 
        mainMenu.addSeparator();
         
        JMenuItem exitItem = new JMenuItem("Exit");
        mainMenu.add(exitItem);
         
        exitItem.addActionListener(new ActionListener() {           
            public void actionPerformed(ActionEvent e) {
                System.exit(0);             
            }           
        });
         
        menuBar.add(mainMenu);                 
        frame.setJMenuBar(menuBar);
        
        JPanel windowContent = new JPanel();                 //кривые кнопки, потом исправлю
        windowContent.setLayout(new BorderLayout());
        JButton buttonUp = new JButton("Up");
        JButton buttonLeft = new JButton("Left");
        JButton buttonDown = new JButton("Down");
        JButton buttonRight = new JButton("Right");
        windowContent.add("North",buttonUp);
        windowContent.add("West",buttonLeft);
        windowContent.add("South",buttonDown);
        windowContent.add("East",buttonRight);
        frame.setContentPane(windowContent);
        
        frame.setPreferredSize(new Dimension(800, 600)); //recommend character
        frame.pack();
        frame.setLocationRelativeTo(null); //center
        frame.setVisible(true);
    }
 
        public static void main (String [] args)
        {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createGUI();
                }
            });
        }
 
}[/QUOTE]
Файл Point.java[QUOTE]import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
 
public class Point extends JPanel {
    int posX, posY;
    Color colorLine;
 
    public Point(int posX,int posY, Color colorLine)
    {
        this.posX = posX;
        this.posY = posY;
        this.colorLine = colorLine;
    }
          
    public void paint(Graphics g) {
            g.setColor (colorLine);
            g.setColor (Color.BLACK);        
            g.drawOval(posX, posY, 50, 50);                  //не точка
            g.drawRoundRect(500, 500, 70, 40, 10, 10);
    }
          
    int get_posX()
    {
        return posX;
    }
    int get_posY()
    {
        return posY;
    }
    Color get_color()
    {
        return colorLine;
    }
}
Запутался уже, не пойму как эту точку нарисовать на фрейме. И, на будущее, можно ли как-то от метода paint(...) избавиться, а рисование засунуть в другой, вызываемый мною, при этом хочется объявить класс Point наследуемым от абстрактного класса, например, "Shape". Хепл, плиз!

Последний раз редактировалось Stilet; 08.09.2014 в 12:18.
Aerowalk вне форума Ответить с цитированием
Старый 08.09.2014, 11:17   #2
Aerowalk
Пользователь
 
Регистрация: 27.10.2008
Сообщений: 15
По умолчанию Что делать

Немного переделал программу. Но все также в тупике. При задании координат точки, рисует эту самую точку только после сдвига границ окна. Что делать? Как заставить обновляться экран?
Код:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Graph extends JFrame {
    JPanel newPointPanel, newSegmentPanel;
	static int a,b,c,d,e,f;

    public Graph() {
        super("Simple Drawing");
        setSize(800, 600);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
/////////////////////////////////////////////////////////////////////////////////////////////////////////
        JMenuBar menuBar = new JMenuBar();
        
        JMenu mainMenu = new JMenu("Menu");
        JMenu newMenu = new JMenu("Set");
        mainMenu.add(newMenu);
 
        JMenuItem pointItem = new JMenuItem("Point");
        newMenu.add(pointItem);
        
        pointItem.addActionListener(new ActionListener() {           
            public void actionPerformed(ActionEvent evt) {
                 String str_positionX = JOptionPane.showInputDialog("Position X of the point");
                 String str_positionY = JOptionPane.showInputDialog("Position Y of the point");

                 a = Integer.parseInt(str_positionX);
                 b = Integer.parseInt(str_positionY);
                 newPointPanel = new Point();    			//новая панель
                 add(newPointPanel);
            }
        });
        JMenuItem segmentItem = new JMenuItem("Segment");
        newMenu.add(segmentItem);
        segmentItem.addActionListener(new ActionListener() {           
            public void actionPerformed(ActionEvent evt) {
                 String str_positionX1 = JOptionPane.showInputDialog("Position X1 of the segment");
                 String str_positionY1 = JOptionPane.showInputDialog("Position Y1 of the segment");
                 String str_positionX2 = JOptionPane.showInputDialog("Position X2 of the segment");
                 String str_positionY2 = JOptionPane.showInputDialog("Position Y2 of the segment");
                 c = Integer.parseInt(str_positionX1);
                 d = Integer.parseInt(str_positionY1);
                 e = Integer.parseInt(str_positionX2);
                 f = Integer.parseInt(str_positionY2);
                 newSegmentPanel = new Segment();    			//новая панель
                 add(newSegmentPanel);
            }
        });
         
        JMenuItem rectangleItem = new JMenuItem("Rectangle");
        newMenu.add(rectangleItem);

        mainMenu.addSeparator();
         
        JMenuItem exitItem = new JMenuItem("Exit");
        mainMenu.add(exitItem);
         
        exitItem.addActionListener(new ActionListener() {           
            public void actionPerformed(ActionEvent e) {
                System.exit(0);             
            }           
        });
        menuBar.add(mainMenu);                 
        setJMenuBar(menuBar);
/////////////////////////////////////////////////////////////////////////////////////////////////////////
    }

    public static void main(String[] args) {
        Graph g1 = new Graph();
        g1.setVisible(true);
    }
    class Point extends JPanel{     //наследуемая панель
    	@Override
    	public void paintComponent(Graphics g) {
    		Graphics2D gr2d = (Graphics2D) g;
    		//gr2d.setBackground(Color.GREEN);
            //super.paintComponent(gr2d);
            gr2d.setColor(Color.BLUE);
            gr2d.setStroke(new BasicStroke(5));
            gr2d.drawLine(a,b,a,b);
        }
    }
    class Segment extends JPanel{    
    	@Override
    	public void paintComponent(Graphics g) {
    		Graphics2D gr2d = (Graphics2D) g;
    		//gr2d.setBackground(Color.GREEN);
            //super.paintComponent(gr2d);
            gr2d.setColor(Color.GREEN);
            gr2d.setStroke(new BasicStroke(5));
            gr2d.drawLine(c,d,e,f);
        }
    }

}

Последний раз редактировалось Stilet; 08.09.2014 в 12:19.
Aerowalk вне форума Ответить с цитированием
Старый 09.09.2014, 12:24   #3
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Важные недочеты:
1) Задание координат в ваших панелях (Point, Segment) не верны по логике. Один элемент - один не зависимый компонент. Т.е. рисование внутри компонента должно происходить от координат компонента, а не родителя.
2) Функция add - для добавления компонента. Без явного указания менеджера размещения используется BorderLayout. Поэтому ваша панель занимала центральную часть. (и с виду казалось что с координатами все хорошо - но это не так)
3) метод paintComponent - не забывайте использовать super.paintComponent(g); - что бы понять в чем отличие, попробуйте без него. А лучше почитайте.
4) Ну и использование общих a,b,c... тоже по моему не уместно. Каждый элемент должен иметь собственные координаты.

Для примера привел измененный код. (Для работы кода используйте Java8)

Код:
package graph;

import java.awt.*;
import javax.swing.*;

public class Graph extends JFrame {
    
    private static final int POINT_SIZE = 5;
    
    private final SpringLayout l = new SpringLayout();
    
    JPanel newPointPanel, newSegmentPanel;
	static int a,b,c,d,e,f;

    public Graph() {
        super("Simple Drawing");
        setLayout(l);
        setSize(800, 600);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
/////////////////////////////////////////////////////////////////////////////////////////////////////////
        JMenuBar menuBar = new JMenuBar();
        JMenu mainMenu = new JMenu("Menu");
        JMenu newMenu = new JMenu("Set");
        mainMenu.add(newMenu);
 
        JMenuItem pointItem = new JMenuItem("Point");
        newMenu.add(pointItem);

        JMenuItem segmentItem = new JMenuItem("Segment");
        newMenu.add(segmentItem);

        JMenuItem rectangleItem = new JMenuItem("Rectangle");
        newMenu.add(rectangleItem);

        mainMenu.addSeparator();
         
        JMenuItem exitItem = new JMenuItem("Exit");
        mainMenu.add(exitItem);

        menuBar.add(mainMenu);                 
        setJMenuBar(menuBar);
        
        segmentItem.addActionListener( evt -> addSegment() );
        pointItem.addActionListener( evt -> addPoint() );
        exitItem.addActionListener( evt -> System.exit(0) );
/////////////////////////////////////////////////////////////////////////////////////////////////////////
    }

    public final void addPoint() {
        String str_positionX = JOptionPane.showInputDialog("Position X of the point");
        String str_positionY = JOptionPane.showInputDialog("Position Y of the point");

        a = Integer.parseInt(str_positionX);
        b = Integer.parseInt(str_positionY);
        newPointPanel = new Point();    			//новая панель
        newPointPanel.setPreferredSize(new Dimension(POINT_SIZE, POINT_SIZE));
        add(newPointPanel);
        l.putConstraint(SpringLayout.NORTH, newPointPanel, b, SpringLayout.NORTH, this);
        l.putConstraint(SpringLayout.WEST, newPointPanel, a, SpringLayout.WEST, this);
        newPointPanel.updateUI();
    }
    
    public final void addSegment() {
        String str_positionX1 = JOptionPane.showInputDialog("Position X1 of the segment");
        String str_positionY1 = JOptionPane.showInputDialog("Position Y1 of the segment");
        String str_positionX2 = JOptionPane.showInputDialog("Position X2 of the segment");
        String str_positionY2 = JOptionPane.showInputDialog("Position Y2 of the segment");
        c = Integer.parseInt(str_positionX1);
        d = Integer.parseInt(str_positionY1);
        e = Integer.parseInt(str_positionX2);
        f = Integer.parseInt(str_positionY2);
        newSegmentPanel = new Segment();    			//новая панель
        newSegmentPanel.setPreferredSize(new Dimension( Math.abs(c - e), Math.abs(d - f)));
        add(newSegmentPanel);
        l.putConstraint(SpringLayout.NORTH, newSegmentPanel, d, SpringLayout.NORTH, this);
        l.putConstraint(SpringLayout.WEST, newSegmentPanel, c, SpringLayout.WEST, this);
        newSegmentPanel.updateUI();
    }
    
    
    private class Point extends JPanel {
        public Point() {
            setBackground(Color.BLUE);
        }
    }

    private class Segment extends JPanel{
    	@Override public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D gr2d = (Graphics2D) g;
            gr2d.setColor(Color.RED);
            gr2d.setStroke(new BasicStroke(POINT_SIZE));
            gr2d.drawLine(0,0, getWidth() - 1, getHeight() - 1);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater( () -> new Graph().setVisible(true) );
    }
}
BleStaR вне форума Ответить с цитированием
Старый 09.09.2014, 20:23   #4
Aerowalk
Пользователь
 
Регистрация: 27.10.2008
Сообщений: 15
По умолчанию Благодарен

Спасибо! я уже не хотел копаться даже в ней и очень огорчился, что с фреймами не дружу. А программу, переделал под апплет, добавив многопоточность. Работает. Сейчас же решил вернуться и начать исследовать вашу интерпретацию.
Код:
package inheritance;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.applet.*;

import javax.swing.*;

public class AppletTask extends Applet implements Runnable {
    private Thread T;
    
    private Point m_Point = null;
    private Segment m_Segment = null;
    private Rectangle m_Rectangle = null;
       
    Button btn_point_create, btn_point1, btn_point2, btn_point3, btn_point4;
    Button btn_segment_create, btn_segment1, btn_segment2, btn_segment3, btn_segment4;
    Button btn_rectangle_create, btn_rectangle1, btn_rectangle2, btn_rectangle3, btn_rectangle4; 
    
    public void run() {
        setBackground(new Color(201,237,240));
        while(true){
            repaint(); 
            try {
                T.sleep(100);
            }
            catch(InterruptedException e){ }
        }
    }
    
    public void init() {
        T = new Thread(this);
Aerowalk вне форума Ответить с цитированием
Старый 09.09.2014, 20:25   #5
Aerowalk
Пользователь
 
Регистрация: 27.10.2008
Сообщений: 15
По умолчанию Продолжение

Код:
/////////////////////////////////////////////////////////////////////////////////////////////////////////
        btn_point_create = new Button ("Создать точку");
        btn_point_create.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent evt) {
                 String str_positionX = JOptionPane.showInputDialog("Position X of the point");
                 String str_positionY = JOptionPane.showInputDialog("Position Y of the point");
                 m_Point.point_x = Integer.parseInt(str_positionX);
                 m_Point.point_y = Integer.parseInt(str_positionY);
            }
        });
        btn_point1 = new Button("Вверх точку");
        btn_point2 = new Button("Влево точку");
        btn_point3 = new Button("Вправо точку");
        btn_point4 = new Button("Вниз точку");
        add(btn_point_create);
        add(btn_point1);
        add(btn_point2);
        add(btn_point3);
        add(btn_point4);
//_______________________________________________________________________________________________________
        btn_segment_create = new Button ("Создать отрезок");
        btn_segment_create.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent evt) {
                String str_positionX1 = JOptionPane.showInputDialog("Position X1 of the segment");
                String str_positionY1 = JOptionPane.showInputDialog("Position Y1 of the segment");
                String str_positionX2 = JOptionPane.showInputDialog("Position X2 of the segment");
                String str_positionY2 = JOptionPane.showInputDialog("Position Y2 of the segment");
                m_Segment.segment_x1 = Integer.parseInt(str_positionX1);
                m_Segment.segment_y1 = Integer.parseInt(str_positionY1);
                m_Segment.segment_x2 = Integer.parseInt(str_positionX2);
                m_Segment.segment_y2 = Integer.parseInt(str_positionY2);
            }
        });
        btn_segment1 = new Button("Вверх отрезок");
        btn_segment2 = new Button("Влево отрезок");
        btn_segment3 = new Button("Вправо отрезок");
        btn_segment4 = new Button("Вниз отрезок");
        add(btn_segment_create);
        add(btn_segment1);
        add(btn_segment2);
        add(btn_segment3);
        add(btn_segment4);
//_______________________________________________________________________________________________________
        btn_rectangle_create = new Button ("Создать прямоугольник");
        btn_rectangle_create.addActionListener(new ActionListener() { 
            public void actionPerformed(ActionEvent evt) {
                String str_positionX11 = JOptionPane.showInputDialog("Position X1 of the rectangle");
                String str_positionY11 = JOptionPane.showInputDialog("Position Y1 of the rectangle");
                String str_positionX22 = JOptionPane.showInputDialog("Position X2 of the rectangle");
                String str_positionY22 = JOptionPane.showInputDialog("Position Y2 of the rectangle");
                m_Rectangle.rectangle_x1 = Integer.parseInt(str_positionX11);
                m_Rectangle.rectangle_y1 = Integer.parseInt(str_positionY11);
                m_Rectangle.rectangle_x2 = Integer.parseInt(str_positionX22);
                m_Rectangle.rectangle_y2 = Integer.parseInt(str_positionY22);
            }
        });
        btn_rectangle1 = new Button("Вверх прямоугольник");
        btn_rectangle2 = new Button("Влево прямоугольник");
        btn_rectangle3 = new Button("Вправо прямоугольник");
        btn_rectangle4 = new Button("Вниз прямоугольник");
        add(btn_rectangle_create);
        add(btn_rectangle1);
        add(btn_rectangle2);
        add(btn_rectangle3);
        add(btn_rectangle4);
/////////////////////////////////////////////////////////////////////////////////////////////////////////
        T.start();
        
        m_Point = new Point();
        m_Segment = new Segment();
    }
    
    public boolean action(Event evt, Object arg) { 	
        if(arg=="Вверх точку")
            m_Point.point_y--;
        else if(arg=="Вниз точку")
        	m_Point.point_y++;
        else if(arg=="Влево точку")
        	m_Point.point_x--;
        else if(arg=="Вправо точку")
        	m_Point.point_x++;
Aerowalk вне форума Ответить с цитированием
Старый 09.09.2014, 20:25   #6
Aerowalk
Пользователь
 
Регистрация: 27.10.2008
Сообщений: 15
По умолчанию Продолжение

Код:
    else if(arg=="Вверх отрезок")
        	{m_Segment.segment_y1--;
        	m_Segment.segment_y2--;}
        else if(arg=="Вниз отрезок")
        	{m_Segment.segment_y1++;
        	m_Segment.segment_y2++;}
        else if(arg=="Вправо отрезок")
        	{m_Segment.segment_x1++;
        	m_Segment.segment_x2++;}
        else if(arg=="Влево отрезок")
        	{m_Segment.segment_x1--;
        	m_Segment.segment_x2--;}       
        
        repaint();
        return true;
    }
    
    public void paint(Graphics g) {
    	Graphics2D gr2d = (Graphics2D) g;
        gr2d.setColor(Color.RED);
        gr2d.setStroke(new BasicStroke(5));
        gr2d.drawLine(m_Point.point_x,m_Point.point_y,m_Point.point_x,m_Point.point_y);
        gr2d.drawLine(m_Segment.segment_x1,m_Segment.segment_y1,m_Segment.segment_x2,m_Segment.segment_y2);
        gr2d.drawPolygon(m_Point.x_coor,m_Point.y_coor,m_Point.x_coor.length);
    }
    
    class Point implements Runnable {
        Thread T;
        private int point_x=-10;
        private int point_y=-10;
        
        int x_coor[]={10,10,40,40};	
        int y_coor[]={140,170,170,140};        public Point() {
            T = new Thread(this);
            T.start();
        }
     
        public void run() {
            for(;;){     		 					//infinite loop
                for(int i=0;i<x_coor.length;i++) {
                    x_coor[i]+=1;
                }
                try {
                    T.sleep(100);
                }
                catch(InterruptedException e){}
            }
        }
    }
    
    class Segment implements Runnable{
        Thread T;
        private int segment_x1=-10;
        private int segment_y1=-10;   
        private int segment_x2=-10;
        private int segment_y2=-10; 
        
        public Segment() {
            T = new Thread(this);
            T.start();
        }
        
        public void run() {
            /*for(;;) {
            	
            try{
                T.sleep(1000);
            }
            	catch(InterruptedException e) {}
            }*/
        }
    }
    class Rectangle extends Segment implements Runnable{
        Thread T;
        private int rectangle_x1=-10;
        private int rectangle_y1=-10;   
        private int rectangle_x2=-10;
        private int rectangle_y2=-10; 
        
        public Rectangle() {
            T = new Thread(this);
            T.start();
        }
        public void draw(){
        	
        }
        public void run() {
            for(;;) {
            try{
                T.sleep(1000);
            }
            	catch(InterruptedException e) {}
            }
        }
    }
}
Ограничения, мать их)
Aerowalk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть два кода на Java MЕ и Java SE(нетбинс и эклипс)помогите пожалуйста их переделать на Си#и Си++(Визуал и QT) jula939393 Помощь студентам 10 28.01.2014 07:08
чтение файла в массив строк java (Перенесено из Java SE) Sasha9132 Помощь студентам 0 18.11.2010 22:57
Помогите справиться с java.lang.OutOfMemoryError: Java heap space Levilaulada Помощь студентам 1 17.05.2009 10:59