2012-08-24 3 views
5

스윙 GUI 디자인을 배우고 있습니다. 내가별로 분류하지 못한 한 가지는 컨테이너에 특정 위치에 Canvas을 추가하는 방법입니다.스윙에서 캔버스의 위치 지정

더 구체적으로는 Paint 메서드를 사용하는 Canvas 클래스를 만듭니다. 이 클래스의 객체가 패널에 추가됩니다. 내가 이해하지 못하는 것은 그것이 패널에 어떻게 추가되는지입니다. Tkinter에서 Canvas은 이미지 만 포함하는 위젯입니다. 그러나 Swing에서는 Canvas 객체 만 포함하는 프레임에 추가 된 유사한 위젯 (아마도 가장 좋은 단어는 아님)이 없습니다.

죄송합니다. 너무 막연한 경우 자체 포함 코드를 추가하고 있습니다. 텍스트 필드와 라벨을 무시하십시오.

import java.awt.BorderLayout; 
import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JSeparator; 
import javax.swing.JTextField; 

//frame class 
class frame_class2 extends JFrame implements ActionListener{ 
    //declare buttons 
    JButton draw_button = new JButton("Draw"); 
    JButton quit_button= new JButton("Quit"); 
    JButton info_button = new JButton("Info"); 
    //declare labels 
    JLabel x_loc = new JLabel("X:"); 
    JLabel y_loc = new JLabel("Y:"); 
    JLabel w_label= new JLabel("Width:"); 
    JLabel h_label = new JLabel("Height:"); 
    //Layout 
    FlowLayout layout_frame1 = new FlowLayout(); 
    //Text boxes 
    JTextField x_loc_box = new JTextField("0"); 
    JTextField y_loc_box = new JTextField("0"); 
    JTextField w_loc_box = new JTextField("100"); 
    JTextField h_loc_box = new JTextField("100"); 
    //Info 
    JOptionPane info1 = new JOptionPane(); 
    //Canvas 
    //Canvas area1 = new Canvas(); 
    //Containers 
    JPanel panel1 = new JPanel(); 
    JPanel panel2= new JPanel(); 
    //Container container3 = new Container(); 
    Container con = getContentPane(); 


    public frame_class2(){  
    //panel1 = getContentPane(); 
    //add(area1); 
    //add labels to the first panel 
    panel1.setLayout(layout_frame1); 
    panel2.setLayout(layout_frame1); 
    panel1.add(x_loc); 
    panel1.add(x_loc_box); 
    panel1.add(y_loc); 
    panel1.add(y_loc_box); 
    panel1.add(w_label); 
    panel1.add(w_loc_box); 
    panel1.add(h_label); 
    panel1.add(h_loc_box); 
    //add buttons to the second panel 
    draw_button.addActionListener(this); 
    quit_button.addActionListener(this); 
    info_button.addActionListener(this); 
    panel2.add(draw_button); 
    panel2.add(quit_button); 
    panel2.add(info_button); 

    con.add(panel1, BorderLayout.NORTH); 
    //con.add(new JSeparator(), BorderLayout.CENTER); 

    con.add(panel2, BorderLayout.SOUTH); 
    setDefaultCloseOperation(super.EXIT_ON_CLOSE); 
    setTitle("Graphics Toolbox v2"); 
    //Set up the content pane. 
     //this.getContentPane(); 
    pack(); 
    //setSize(500, 500); 
    setLocationRelativeTo(null); 
    //setBackground(Color.BLUE); 
    setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    // TODO Auto-generated method stub 
    if (e.getSource()==info_button){ 
     info1.showMessageDialog(this, "hahahahahaha"); 
    } 
    else if (e.getSource()==quit_button){ 
     System.exit(0); 
    } 
    else if (e.getSource()==draw_button){ 

     graphics_class2 input1 = new graphics_class2(); 
     con.add(input1);   
     //info1.showMessageDialog(this, "Not yet!"); 

    } 


    } 



} 

//graphics class 
class graphics_class2 extends Canvas{ 

    public graphics_class2(){ 
    //frame_class1 inst1 = new frame_class1(); 
    //Canvas img1 = inst1.area1; 
    setSize(50,50); 
    //setBackground(Color.BLUE); 
    } 

    public void paint(Graphics g){ 
    super.paint(g); 
    g.setColor(Color.GREEN); 
    g.fillArc(0, 0, 50, 50, 50, 50); 

    } 



} 



public class main_code { 

    public static void main(String args[]){ 
    frame_class2 inst1 = new frame_class2(); 
    } 



} 
+0

은 무슨 일이야? 내 해결책을 받아들이지 않았 니? 이유를 받아 들일 수 없습니까? –

+0

+1 [sscce] (http://sscce.org/); Alex는 무료입니다 (아무 대답이나 허용하지 않음) (http://meta.stackexchange.com/a/5235/163188). – trashgod

답변

4

"스윙 프로그램은 paint()을 무시하는 대신 paintComponent()을 무시해야합니다."- Painting in AWT and Swing: The Paint Methods. 과 같이 JPanel 또는 JComponent이 일반적인 선택입니다. 적절한 layout을 사용하여 게재 위치를 제어 할 수 있습니다.

부록 : 이것은 어떻게 Canvas과 관련이 있습니까?

클래스 java.awt.Canvas은 AWT 구성 요소입니다. Swing 구성 요소 javax.swing.JPanel을 대신 사용하십시오. 다음은 임의의 색상을 선택하는 프로그램 변형입니다. 그러나 다른 속성을 처리하는 방법을 알려줄 수 있습니다. 관련 예제 here이 있습니다.

image

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class MainCode { 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       MainView fc = new MainView(); 
      } 
     }); 
    } 

    private static class MainView implements ActionListener { 

     private JFrame f = new JFrame(); 
     private JButton colorButton = new JButton("Color"); 
     private JButton quitButton = new JButton("Quit"); 
     private JButton infoButton = new JButton("Info"); 
     private JLabel x_loc = new JLabel("X:"); 
     private JLabel y_loc = new JLabel("Y:"); 
     private JLabel w_label = new JLabel("Width:"); 
     private JLabel h_label = new JLabel("Height:"); 
     private JTextField x_loc_box = new JTextField("0"); 
     private JTextField y_loc_box = new JTextField("0"); 
     private JTextField w_loc_box = new JTextField("100"); 
     private JTextField h_loc_box = new JTextField("100"); 
     private JOptionPane info1 = new JOptionPane(); 
     private JPanel panel1 = new JPanel(); 
     private JPanel panel2 = new JPanel(); 
     private GraphicsClass graphicsClass = new GraphicsClass(); 

     public MainView() { 
      panel1.add(x_loc); 
      panel1.add(x_loc_box); 
      panel1.add(y_loc); 
      panel1.add(y_loc_box); 
      panel1.add(w_label); 
      panel1.add(w_loc_box); 
      panel1.add(h_label); 
      panel1.add(h_loc_box); 
      colorButton.addActionListener(this); 
      quitButton.addActionListener(this); 
      infoButton.addActionListener(this); 
      panel2.add(colorButton); 
      panel2.add(quitButton); 
      panel2.add(infoButton); 
      f.add(panel1, BorderLayout.NORTH); 
      f.add(graphicsClass, BorderLayout.CENTER); 
      f.add(panel2, BorderLayout.SOUTH); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      f.setTitle("Graphics Toolbox v2"); 
      f.pack(); 
      f.setLocationRelativeTo(null); 
      f.setVisible(true); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() == infoButton) { 
       JOptionPane.showMessageDialog(f, "hahahahahaha"); 
      } else if (e.getSource() == quitButton) { 
       System.exit(0); 
      } else if (e.getSource() == colorButton) { 
       graphicsClass.randomColor(); 
       graphicsClass.repaint(); 
      } 
     } 
    } 

    private static class GraphicsClass extends JPanel { 

     private static final int SIZE = 128; 
     private static final Random r = new Random(); 
     private Color color = Color.green; 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(SIZE, SIZE); 
     } 

     public void randomColor() { 
      this.color = new Color(r.nextInt()); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(color); 
      int w = getWidth(); 
      int h = getHeight(); 
      g.fillArc(0, h/4, w, h, 45, 90); 
     } 
    } 
} 
+0

이미지를 위해 별도의'JPanel' 객체를 호출해야한다는 것을 의미합니까? – Alex

+0

예,'JPanel' 서브 클래스에서'paintComponent()'를 오버라이드합니다. 또는, BufferedImage를 사용하여이 [Example] (http://stackoverflow.com/a/7343420/230513)을 참조하십시오. – trashgod

+0

이것이 캔버스와 어떻게 관련되어 있는지 설명해 주시겠습니까? –

1

이 패널의 끝 부분에 캔버스를 추가합니다. 디스플레이 된 컨테이너에 구성 요소가 추가되었습니다. 새 구성 요소를 표시하려면 해당 컨테이너에서 validate을 호출해야합니다.

+0

좋은 이유없이 동적으로 구성 요소를 추가하지 않아야합니다. – trashgod