2015-05-31 4 views
1

Я пытаюсь сделать очень простую вещь .. в классе Main я рисую 2 строки для системы координат .. и в классе userPaint рисую 1 строку из x1 y1 x2 y2 (уже инициализировано). Проблема в том, что 3 строки (система координат и строка x1y1x2y2) находятся не в одном окне/кадре. Компилятор создает 2 окна ... как я могу это исправить?Java Draw Lines в одном кадре

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

import static javax.swing.JFrame.EXIT_ON_CLOSE; 
import java.awt.*; 
import javax.swing.*; 

public class Main extends JFrame { 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     g.drawLine(20, 80, 20, 200); 
     g.drawLine(20, 200, 140, 200); 
    } 

    public Main(String title){ 
     super(title); 
     setSize(800, 600); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     Main main = new Main("Graph"); 
     userPaint up = new userPaint(); 
    } 
} 

userPaint класс:

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

public class userPaint extends JFrame { 
    int x1, y1, x2, y2; 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     g.drawLine(x1, y1, x2, y2); 
    } 

    public userPaint(){ 
     //Gives 4 numbers for points to drawline. Assume that the x1,y1,x2,y2 are given by Scanner.. but im gonna initialize 
     x1 = 200; 
     y1 = 200; 
     x2 = 300; 
     y2 = 300; 
     setSize(800, 600); 
     setVisible(true); 
    } 
} 
+0

Вы хотите рисовать в одном окне - так используйте одно окно и нарисуйте 2 линии в нем. Вам не нужны 2 класса - один достаточно хорош, и он должен рисовать все строки. Другими словами - объедините эти 2 класса в один, и у вас будет одно окно. – Alex

+0

Да, но я хочу, чтобы 1 строка была исправлена ​​.. (основной класс) и другая строка, заданная пользователем (x1, y1, x2, y2), поэтому, если я делаю в 1 классе, будет: public void paint (Графика g) { super.paint (g); g.drawLine (20, 80, 20, 200); g.drawLine (20, 200, 140, 200); g.drawLine (x1, y1, x2, y2); // Где он берет переменные? } – Sotnam96

+1

У 'JFrame' есть' JPanel', который управляет живописью - покраска должна быть выполнена путем переопределения метода paintComponent – copeg

ответ

4
  1. Не рисуйте прямо на JFrame, а краска на JPanel, которые вы можете добавить панель содержимое JFrame по методу JFrameadd
  2. Картина в (1) должна выполняться ove (paint).

Например:

public class Painter extends JPanel{ 

    public Painter(){ 

    } 

    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.drawLine(20, 80, 20, 200); 
     g.drawLine(20, 200, 140, 200); 
     g.drawLine(x1, y1, x2, y2); 
    } 
} 

... 
JFrame frame = new JFrame("Title"); 
frame.add(new Painter()); 

нарисовать 2 линии для системы координат

Вы упоминаете систему координат, так что вы можете компенсировать значения x1..y2 с системы координат, поэтому нарисованная линия попадает в границы оси. В качестве примера:

 g.drawLine(20, 80, 20, 200);//y-axis 
     g.drawLine(20, 200, 140, 200);//x-axis 
     g.drawLine(x1 + 20, 200 - y1, x2 + 20, 200 - y2);//offset by coordinate system 

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

одно замечание: имена классов должны быть в верхнем регистре

+0

, если я это сделаю с помощью JPanel, тогда компилятор не понимает super ("Title Name"), поэтому как я могу установить имя окна, размер и т. д.? – Sotnam96

+0

Это делается при построении JFrame. См. Небольшое редактирование в фрагменте кода выше - 1) создать JFrame, установить его имя, макет и т. Д. 2) Создать экземпляр класса Painter 3) добавить (2) в (1) – copeg

+1

FYI: 'paintComponent' должен быть «защищенным», нет никакой необходимости, чтобы кто-нибудь мог его назвать – MadProgrammer

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