2014-05-22 9 views
0

Java 그래픽 인터페이스를 사용하여 분기 및 잘라 내기 트리를 표시하지만 트리의 크기가 커서 완전히 볼 수없는 경우 스크롤 할 수 있도록 스크롤 막대를 추가하기로 결정했습니다. 쉽게,하지만 작동하지 않습니다. 내 코드 :내 스크롤 창이 작동하지 않는 이유

package minemodel; 

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.AffineTransform; 
import java.util.ArrayList; 
import java.util.Iterator; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 

public class BAndBGUI { 
    private int _distance; 
    private JFrame _frame; 
    private MyPannel _mainPannel; 
    private ArrayList<NodeForTree> _node; 
    public BAndBGUI(int convNumber) { 
    _node=new ArrayList<NodeForTree>(); 
    _frame=new JFrame(); 
    _distance=700/convNumber; 
    _mainPannel=new MyPannel(); 
    _frame.setVisible(true); 
    _frame.setSize(1350, 700); 
    _frame.setLocation(0, 0); 
    _frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JScrollPane scrollPane = new JScrollPane(_mainPannel); 

    _frame.add(scrollPane); 

} 

public MyPannel getPanel(){ 
    return _mainPannel; 
} 

public void setNode(NodeForTree node){ 
    _node.add(node); 
    _mainPannel.repaint(); 
} 

public class MyPannel extends JPanel{ 

    /** 
    * 
    * @param level the level of the current node 
    * @param number number of nodes currently on that level, 
    * @param Parent's locaton to draw the line. 
    * @return 
    */ 


    public void paintComponent(Graphics g){ 
     // super.paintComponent(g); 
     Iterator<NodeForTree> itrNode=_node.iterator(); 
     while (itrNode.hasNext()){ 
      NodeForTree node=itrNode.next(); 

      g.drawOval(node.getLocation()[0], node.getLocation()[1], 20, 20); 
      g.setFont(new Font("Arial", Font.BOLD, 14)); 
      g.setColor(Color.BLACK); 
      if (node.getParent()!=null){ 
       g.drawString(node.toString(),node.getLocation()[0], node.getLocation()[1]+15); 
       NodeForTree parrent=node.getParent(); 
       drawArrow(g,parrent.getLocation()[0], parrent.getLocation()[1], node.getLocation()[0], node.getLocation()[1]); 
       System.out.println("parent"+parrent.getLocation()[0]+" "+parrent.getLocation()[1]+" and "+node.getLocation()[0]+" "+node.getLocation()[1]); 

       // g.drawLine(node.getLocation()[0], node.getLocation()[1],parrent.getLocation()[0], parrent.getLocation()[1]); 

      }else{ 
       g.drawString("start",500, 15); 
      } 
      g.drawString(node.getObjective(),node.getLocation()[0], node.getLocation()[1]); 
     } 
    } 

    public void drawArrow (Graphics g1, int x1, int y1, int x2, int y2) { 
     Graphics2D g = (Graphics2D) g1.create(); 

     double dx = x2 - x1, dy = y2 - y1; 
     double angle = Math.atan2(dy, dx); 
     int len = (int) Math.sqrt(dx*dx + dy*dy); 
     AffineTransform at = AffineTransform.getTranslateInstance(x1, y1); 
     at.concatenate(AffineTransform.getRotateInstance(angle)); 
     g.transform(at); 

     // Draw horizontal arrow starting in (0, 0) 
     g.setColor(Color.BLACK); 
     g.drawLine(0, 0, len, 0); 
     // g.setColor(Color.BLUE); 
     g.fillPolygon(new int[] {len, len-5, len-5, len}, new int[] {0, -5, 5, 0}, 4); 
    } 


} 


} 

도와 주시겠습니까?

답변

1

구성 요소의 크기를 결정하고 스크롤해야하는지 결정하기 위해 스크롤 창에 크기 조정 참고 사항을 제공하지 않았습니다.

우선 MyPannelgetPreferredSize 메서드를 재정 의하여 시작하고 구성 요소의 크기를 가장 잘 나타내는 값을 반환하십시오.

가능한 경우 사전에 가장 잘 계산됩니다.

+0

자세히 설명해 주시겠습니까? – azar

+0

스크롤 창에 구성 요소의 크기를 알려주려면 기본 크기는'0x0'입니다. 크기 조정 힌트를 제공하지 않는 한 스크롤 창에 어떤 크기의 구성 요소가 있어야할지 전혀 알 수 없습니다. – MadProgrammer

+0

어떻게해야할지 모르겠습니까? 내 MyPannel 클래스에 추가해야합니까 ??? – azar