2012-11-29 7 views
3

작은 질문이 있습니다. 다른 클래스/파일/메소드의 메인 클래스에서 JPanel을 어떻게 다시 칠할 수 있습니까?Java : 다른 클래스의 JPanel에 페인팅

이야기는, 폴더의 파일과 클래스를 살펴보고 설명 (주석)을 사용하여 메서드를 읽음으로써 자동으로 생성되는 메서드 목록이있는 스윙 창을 가지고 있다는 이야기입니다. 이제, 한 가지 방법으로 페인팅해야하는 클래스가 생기면 원과 선을 사용하는 태양을 가정 해 봅시다. 그런 다음 어떻게하면 기본 창에 표시 할 수 있습니까?

JPanel은 편리해야하지만 다른 클래스 및 메소드에서 페인팅을해야하며, 이름이 무엇인지 알지 못하고 언제 페인팅을 사용할 것인지 알지 못했습니다. .. 어려움.

그 어떤 유용 할 것입니다 경우에 나는 또한, 주요 방법을 추가하고있어 ..

또한
static int indez = 0; 
    protected static JList list; 
    static boolean valitud = false; 
    public static JTextArea txtala; 
    public static JScrollPane scrl; 
    public static JPanel pilt; 
    static Map<Integer, String[]> info = new TreeMap<Integer, String[]>(); 
    static ArrayList<Integer> nrs = new ArrayList<Integer>(); 
    public static void main(String[] args){ 
     Iterator<Entry<Integer, String[]>> iterator; 
     Entry<Integer, String[]> entry; 
     Integer val = 0; 

     JFrame f = new JFrame("Praktikumid"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(750, 350); 

     JPanel panel = new JPanel(); 
     pilt = new JPanel(){public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawString("This is my custom Panel!", 10, 20); 
     }}; 

     pilt.setVisible(false); 
     pilt.setPreferredSize(new Dimension(f.getWidth() - 200, f.getHeight() - 20)); 
     pilt.setBackground(Color.GRAY); 

     GroupLayout layout = new GroupLayout(panel); 
     panel.setLayout(layout); 
     layout.setAutoCreateGaps(true); 
     layout.setAutoCreateContainerGaps(true); 

     ActionListener kuular = new ActionListener() { 
      public void actionPerformed(ActionEvent tegu) { 
       valitud = true; 
       try { 
        praxStarter(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 

     MouseListener hiir = new MouseListener() { 
      public void mouseClicked(MouseEvent e) { 
       indez = list.getSelectedIndex(); 
      } 
      @Override 
      public void mouseEntered(MouseEvent e) {} 
      @Override 
      public void mouseExited(MouseEvent e) {} 
      @Override 
      public void mousePressed(MouseEvent e) {} 
      @Override 
      public void mouseReleased(MouseEvent e) {} 
     }; 

     JLabel kiri = new JLabel("Vali hiirega ja vajuta nupule"); 

     ArrayList<String> selections = new ArrayList<String>(); 

     // Iterating over all the items in another method to get the modules 

     list = new JList(selections.toArray()); 
     list.setSelectedIndex(0); 
     list.addMouseListener(hiir); 

     JScrollPane listScroller = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     listScroller.setMinimumSize(new Dimension(200, 50)); 
     listScroller.setMaximumSize(new Dimension(200, f.getHeight() * 1000)); 

     JButton button = new JButton("Vali"); 
     button.setActionCommand(Integer.toString(list.getSelectedIndex())); 
     button.addActionListener(kuular); 

     Font font = new Font("Arial", Font.PLAIN, 12); 
     txtala = new JTextArea("<-- Vali sealt"); 
     txtala.setEditable(false); 
     txtala.setMargin(new Insets(5, 8, 0, 0)); 
     txtala.setFont(font); 
     scrl = new JScrollPane(txtala, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     scrl.setPreferredSize(new Dimension(f.getWidth() - 200, f.getHeight() - 20)); 

     pilt.setBackground(Color.PINK); 
     pilt.setVisible(false); 
     pilt.setPreferredSize(new Dimension(f.getWidth() - 200, f.getHeight() - 20)); 

     GroupLayout.ParallelGroup menu = layout.createParallelGroup(); 
     GroupLayout.SequentialGroup row = layout.createSequentialGroup(); 
     GroupLayout.SequentialGroup leftright = layout.createSequentialGroup(); 
     GroupLayout.ParallelGroup topdown = layout.createParallelGroup(); 
     GroupLayout.ParallelGroup dbl = layout.createParallelGroup(); 
     GroupLayout.ParallelGroup dblrow = layout.createParallelGroup(); 

     menu.addComponent(kiri); 
     menu.addComponent(listScroller); 
     menu.addComponent(button); 
     leftright.addGroup(menu); 
     dbl.addComponent(scrl); 
     dbl.addComponent(pilt); 
     leftright.addGroup(dbl); 

     row.addComponent(kiri); 
     row.addComponent(listScroller); 
     row.addComponent(button); 
     topdown.addGroup(row); 
     dblrow.addComponent(scrl); 
     dblrow.addComponent(pilt); 
     topdown.addGroup(dblrow); 

     layout.setHorizontalGroup(leftright); 
     layout.setVerticalGroup(topdown); 

     panel.setComponentZOrder(pilt, 1); 
     panel.setComponentZOrder(scrl, 0); 

     f.add(panel); 
     //f.pack(); 
     f.setVisible(true); 
    } 

    public static void praxStarter() throws Exception{ 
      // As a note - nrs is the holder for menu indexes 
      // info is a Map of those same menu items 
      // And one entry in info is in the form of String[]{name, class.method} 
     String[] tekst = new String[2]; 
     String kls, met; 
     Method meetod; 

     txtala.setText(""); 

     tekst = info.get(nrs.get(indez)); 
     kls = tekst[1].substring(0, tekst[1].indexOf(".")); 
     met = tekst[1].substring(tekst[1].indexOf(".") + 1, tekst[1].length()); 

     meetod = Class.forName(kls).getMethod(met); 
     meetod.setAccessible(true); 
     meetod.invoke(Class.forName(kls).newInstance()); 
    } 

, 여기가 하나 개의 클래스 그리기 (또는 그릴려고)의 예를 들어 다음과 같습니다

public class brush extends Applet { 
public void paint(Graphics g) { 
     int x0 = 150; 
     int y0 = 150; 
     int r = 100; 
     int x, y; 
     double t; 

     int w = getWidth(); 
     int h = getHeight(); 

     x0 = w/2; 
     y0 = h/2; 

     g.setColor(Color.white); 
     g.fillRect(0, 0, w, h); 

     g.setColor(Color.black); 

     for (t = -Math.PI; t < Math.PI; t = t + Math.PI/16) { 
      x = (int) (r * Math.cos(t) + x0); 
      y = (int) (r * Math.sin(t) + y0); 
      g.drawLine(x0, y0, x, y); 
     } 
    } 
} 

미리 답변 해 주셔서 감사합니다.

편집 : 왼쪽에 Screenshots

일반, 인쇄 텍스트 화면 모듈 : 여기 스크린 샷입니다. 오른쪽에는 텍스트 부분이 숨겨져 있고 JPanel은 pilt = new JPanel() 부분에서 그려진 JPanel과 함께 표시되지만 메인 클래스 외부에서는 아무런 문제없이 수정되었습니다.

편집 : 나는 여러 가지 방법으로 그려 내려고 노력하여 해결책 검색을 시도했습니다.

`txtala.setVisible(false); 
scrl.setVisible(false); 
pilt.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
pilt.setVisible(true); 
//bi = new BufferedImage(pilt.getWidth() + 1000, pilt.getHeight() + 1000, BufferedImage.TYPE_INT_ARGB); 
Graphics g = pilt.getGraphics(); 
g.setColor(Color.black); 
g.drawLine(0, 0, 1000, 1000); 
g.drawString("OLOLOLOLO!", 30, 50); 
pilt.paint(g); 
pilt.update(g); 
//g.dispose(); 
//repaint();` 
+0

'meetod.invoke (...) '로 호출 할 수있는 메소드가 페인트 할 수 있어야한다는 것을 의미합니까? – denisw

+0

글쎄요, 일종의, meetod.invoke는 메소드를 호출하는 것입니다 .. – Thara

+0

정확히 무엇을 달성하기를 원하는지 전혀 명확하지 않습니다. 어쩌면 당신은 당신이 가지고있는 UI의 이미지를 게시 할 수 있습니까? 어쩌면 이렇게하면 원하는 동작을 명확하게 만들 수 있습니다. – denisw

답변

0

오카이, 그래서 나는 쉽게 갔다. 메인 윈도우에서 같은 창을 사용하는 대신, 나는 새로운 팝업을 작성하고 그 안에 프레임을 넣었습니다. 나는 가장 좋은 해결책은 아니지만 건초, 아무것도 아닌 것보다 낫다. 팝업없이 할 수있는 방법을 찾아 낼 수 있다면 여기에 게시 할 것입니다. 그때까지 행운을 빌어 요!

관련 문제