2016-10-27 9 views
0

저는 숙제 지정 작업을하고 있습니다. 사용자가 원하는 모양과 선을 페인트하고 화면에서 움직일 수있는 프로그램을 만들어야합니다.PaintComponent가 JPanel에 페인팅되지 않았습니다. [숙제]

Origionally 페인트 칠을 위해 공백 페인트 (g)를 사용했지만 페인트 칠을했을 때 모양이 깜박였습니다.

그 때문에 나는 paintComponent (g)로 전환했습니다. 그러나 모양을 칠하려고 할 때 아무 것도 나타나지 않습니다. 내 Jpanel의 윗면 그림이 아니기 때문에 이것이라고 생각합니다.

내 프레임에는 3 행 borderLayout에 3 개의 Jpanels이 있습니다.

[버튼 인 JPanel]

가 [그리기 상자 JPanel의]

I가 그리는 싶습니다 패널은 그리기 상자 JPanel의 자연적이다 JPanel의 좌표]. 여기

는 내가 가지고있는 코드는 현재

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 

import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenuBar; 
import javax.swing.JPanel; 

public class Main extends JPanel implements ActionListener, MouseListener, MouseMotionListener { 

private String colors[] = { "Black", "Red", "Orange", "Yellow", "Green", "Blue" }; 
private String shapes[] = { "Ellipse", "Line", "Rectangle" }; 
private JMenuBar toolBar; // flow layout? OR box layout x-Axis 
private JPanel drawBox; 
private JPanel coordBox; 
private JLabel coords; 
private JButton undo = new JButton("Undo"); 
private JButton clear = new JButton("Clear"); 
private JComboBox color = new JComboBox(colors); 
private JComboBox shape = new JComboBox(shapes); 
private JCheckBox fill = new JCheckBox("Filled"); 

public Main() { 
JFrame frame = new JFrame("Paint"); 
frame.setSize(400, 600); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setLocationRelativeTo(null); 
frame.setVisible(true); 
frame.setLayout(new BorderLayout()); 

/* 
* SETUP TOOLBAR 
*/ 
toolBar = new JMenuBar(); 
toolBar.setLayout(new GridLayout(1, 5)); 
toolBar.add(undo); 
toolBar.add(clear); 
toolBar.add(color); 
toolBar.add(shape); 
toolBar.add(fill); 

/* 
* ADD ACTION LISTENERS TO BUTTONS 
*/ 
undo.addActionListener(this); 
clear.addActionListener(this); 
color.addActionListener(this); 
shape.addActionListener(this); 
fill.addActionListener(this); 

/* 
* SETUP DRAW BOX 
*/ 
drawBox = new JPanel(); 
drawBox.setOpaque(true); 
drawBox.setPreferredSize(new Dimension(600, 400)); 
drawBox.addMouseListener(this); 
drawBox.addMouseMotionListener(this); 

/* 
* SETUP COORDINATES 
*/ 
coords = new JLabel(); 
coordBox = new JPanel(); 

coordBox.setBackground(new Color(211, 211, 211)); 
coordBox.setPreferredSize(new Dimension(drawBox.getWidth(), 25)); 

coords.setText("Coords: [0,0]"); 
coords.addMouseMotionListener(this); 

coordBox.add(coords); 

/* 
* ADD TO FRAME 
*/ 

frame.add(toolBar, BorderLayout.NORTH); 
frame.add(drawBox, BorderLayout.CENTER); 
frame.add(coordBox, BorderLayout.SOUTH); 

frame.pack(); 

} 

public static void main(String[] args) { 
Main m = new Main(); 
} 

public void paintComponent(Graphics g) { 
// super.paintComponent(g); 
g.setColor(Color.BLACK); 
g.fillRect(300, 300, 100, 100); 

} 

@Override 
public void actionPerformed(ActionEvent e) { 
if (e.getSource() == undo) { 
    System.out.println("Undo Last"); 
} 

if (e.getSource() == clear) { 
    System.out.println("clearing screen"); 
} 
// COLOR DROP DOWN BOX 
if (e.getSource() == color) { 
    JComboBox cb = (JComboBox) e.getSource(); 
    String selected = (String) cb.getSelectedItem(); 
    switch (selected) { 

    case "Red": 
    System.out.println("switching to color red"); 
    //ellipse.setColor(Color.RED); 

    break; 

    case "Orange": 
    System.out.println("switch to coor orange"); 
    //ellipse.setColor(Color.ORANGE); 
    break; 
    case "Yellow": 
    System.out.println("switching to color yellow"); 
    break; 
    case "Green": 
    System.out.println("Switching to green"); 
    //ellipse.setColor(Color.GREEN); 

    break; 
    case "Blue": 
    System.out.println("Switching to blue"); 
    break; 
    default: 
    System.out.println("NOthing selected"); 
    break; 
    } 
} 
// SHAPE DROP DOWN BOX 
if (e.getSource() == shape) { 
    JComboBox cb = (JComboBox) e.getSource(); 
    String selected = (String) cb.getSelectedItem(); 
    switch (selected) { 
    case "Ellipse": 
    System.out.println("switching to ellipse"); 
    break; 
    case "Line": 
    System.out.println("switch to line"); 
    break; 
    case "Rectangle": 
    System.out.println("switching to rectangle"); 
    break; 

    default: 
    System.out.println("NOthing selected"); 
    break; 
    } 
} 

if (e.getSource() == fill) { 
    JCheckBox cb = (JCheckBox) e.getSource(); 
    if (cb.isSelected()) { 
    System.out.println("Fill shape"); 
    //ellipse.setFilled(true); 
    } else { 
    System.out.println("Empty shape"); 
    //ellipse.setFilled(false); 
    } 
} 

} 

@Override 
public void mouseClicked(MouseEvent arg0) { 
// System.out.println("Mouse clicked"); 

} 

@Override 
public void mouseEntered(MouseEvent e) { 
System.out.println("Mouse entered"); 
} 

@Override 
public void mouseExited(MouseEvent arg0) { 
coords.setText("Coords: N/A"); 

} 

@Override 
public void mousePressed(MouseEvent arg0) { 
System.out.println("Mouse pressed"); 

} 

@Override 
public void mouseReleased(MouseEvent arg0) { 
System.out.println("Mouse Released"); 

} 

@Override 
public void mouseDragged(MouseEvent e) { 
coords.setText("Coords: [" + e.getX() + "," + e.getY() + "]"); 
} 

@Override 
public void mouseMoved(MouseEvent e) { 
coords.setText("Coords: [" + e.getX() + "," + e.getY() + "]"); 
// repaint(); 
// revalidate(); 

} 

}

답변

4

메인 클래스는, JPanel을 확장하는 paintComponent에 방법이 있습니다 -하지만 당신이 대신 GUI에 홈페이지의 인스턴스를 추가하지를 일반 바닐라 JPanel, drawBox를 GUI에 추가하면 paintComponent는 절대 호출되지 않습니다.

해결 방법 : 일반 JPanel이 아닌 기본 또는 this을 GUI에 추가하십시오.

+0

감사합니다. 작동하는 것처럼 보였습니다. 나는 drawBox JPanel을 모두 없애고 프레임에 'this'를 추가했습니다. – GreenFerret95

2

그리기 패널은 자연스럽게 그리기 상자 JPanel입니다.

drawBox = new JPanel(); 

그럼 당신은 당신의 "drawBox"패널의 paintComponent(...) 방법은 그래서 그림이 일어나지 않습니다 무시하지 않았다.

또한 항상 paintComponent (...) 메소드의 시작 부분에서 super.paintComponent (...)를 호출해야 할 때마다.

사용자 정의 페인팅을 수행하는 두 가지 일반적인 방법의 작동 예는 Custom Painting Approaches을 확인하십시오.