2010-12-07 4 views
3

일부 원시 그래픽과 관련하여 질문이 있습니다. 저는 일반적으로 자바 그래픽과 GUI를 처음 사용하기 때문에 많은 질문을받습니다.
Netbeans 6.9.1을 사용하고 있습니다. 기본적으로 메인 프레임과 패널이 있습니다. 패널 안에 그래프를 그려 넣고 싶습니다. 글쎄, 그 질문을하는거야? 에서Netbeans의 jPanel에있는 2D 그래프

package graphics; 

import org.jdesktop.application.Application; 
import org.jdesktop.application.SingleFrameApplication; 

/** 
* The main class of the application. 
*/ 
public class GraphicsApp extends SingleFrameApplication { 

/** 
* At startup create and show the main frame of the application. 
*/ 
@Override protected void startup() { 
    show(new GraphicsView(this)); 
} 

/** 
* This method is to initialize the specified window by injecting resources. 
* Windows shown in our application come fully initialized from the GUI 
* builder, so this additional configuration is not needed. 
*/ 
@Override protected void configureWindow(java.awt.Window root) { 
} 

/** 
* A convenient static getter for the application instance. 
* @return the instance of GraphicsApp 
*/ 
public static GraphicsApp getApplication() { 
    return Application.getInstance(GraphicsApp.class); 
} 

/** 
* Main method launching the application. 
*/ 
public static void main(String[] args) { 
    launch(GraphicsApp.class, args); 
} 
} 

: 그래서, 여기에 난 단지

jPanel1.add(new Graph()); 

다음 메인 클래스 추가 한

package graphics; 

import org.jdesktop.application.Action; 
import org.jdesktop.application.ResourceMap; 
import org.jdesktop.application.SingleFrameApplication; 
import org.jdesktop.application.FrameView; 
import org.jdesktop.application.TaskMonitor; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.Timer; 
import javax.swing.Icon; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
/** 
* The application's main frame. 
*/ 
public class GraphicsView extends FrameView { 

public GraphicsView(SingleFrameApplication app) { 
    super(app); 

    initComponents(); 

    jPanel1.add(new Graph()); 

    // status bar initialization - message timeout, idle icon and busy animation, etc 
    ResourceMap resourceMap = getResourceMap(); 
    int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout"); 
    messageTimer = new Timer(messageTimeout, new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      statusMessageLabel.setText(""); 
     } 
    }); 
    messageTimer.setRepeats(false); 
    int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate"); 
    for (int i = 0; i < busyIcons.length; i++) { 
     busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]"); 
    } 
    busyIconTimer = new Timer(busyAnimationRate, new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      busyIconIndex = (busyIconIndex + 1) % busyIcons.length; 
      statusAnimationLabel.setIcon(busyIcons[busyIconIndex]); 
     } 
    }); 
    idleIcon = resourceMap.getIcon("StatusBar.idleIcon"); 
    statusAnimationLabel.setIcon(idleIcon); 
    progressBar.setVisible(false); 

    // connecting action tasks to status bar via TaskMonitor 
    TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext()); 
    taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() { 
     public void propertyChange(java.beans.PropertyChangeEvent evt) { 
      String propertyName = evt.getPropertyName(); 
      if ("started".equals(propertyName)) { 
       if (!busyIconTimer.isRunning()) { 
        statusAnimationLabel.setIcon(busyIcons[0]); 
        busyIconIndex = 0; 
        busyIconTimer.start(); 
       } 
       progressBar.setVisible(true); 
       progressBar.setIndeterminate(true); 
      } else if ("done".equals(propertyName)) { 
       busyIconTimer.stop(); 
       statusAnimationLabel.setIcon(idleIcon); 
       progressBar.setVisible(false); 
       progressBar.setValue(0); 
      } else if ("message".equals(propertyName)) { 
       String text = (String)(evt.getNewValue()); 
       statusMessageLabel.setText((text == null) ? "" : text); 
       messageTimer.restart(); 
      } else if ("progress".equals(propertyName)) { 
       int value = (Integer)(evt.getNewValue()); 
       progressBar.setVisible(true); 
       progressBar.setIndeterminate(false); 
       progressBar.setValue(value); 
      } 
     } 
    }); 
} 

@Action 
public void showAboutBox() { 
    if (aboutBox == null) { 
     JFrame mainFrame = GraphicsApp.getApplication().getMainFrame(); 
     aboutBox = new GraphicsAboutBox(mainFrame); 
     aboutBox.setLocationRelativeTo(mainFrame); 
    } 
    GraphicsApp.getApplication().show(aboutBox); 
} 

/** This method is called from within the constructor to 
* initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is 
* always regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code"> 
private void initComponents() { 

    mainPanel = new javax.swing.JPanel(); 
    jPanel1 = new javax.swing.JPanel(); 
    menuBar = new javax.swing.JMenuBar(); 
    javax.swing.JMenu fileMenu = new javax.swing.JMenu(); 
    javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem(); 
    javax.swing.JMenu helpMenu = new javax.swing.JMenu(); 
    javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem(); 
    statusPanel = new javax.swing.JPanel(); 
    javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator(); 
    statusMessageLabel = new javax.swing.JLabel(); 
    statusAnimationLabel = new javax.swing.JLabel(); 
    progressBar = new javax.swing.JProgressBar(); 

    mainPanel.setName("mainPanel"); // NOI18N 

    jPanel1.setName("jPanel1"); // NOI18N 

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 
    jPanel1.setLayout(jPanel1Layout); 
    jPanel1Layout.setHorizontalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 380, Short.MAX_VALUE) 
    ); 
    jPanel1Layout.setVerticalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 229, Short.MAX_VALUE) 
    ); 

    javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel); 
    mainPanel.setLayout(mainPanelLayout); 
    mainPanelLayout.setHorizontalGroup(
     mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(mainPanelLayout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
      .addContainerGap()) 
    ); 
    mainPanelLayout.setVerticalGroup(
     mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(mainPanelLayout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
      .addContainerGap()) 
    ); 

    menuBar.setName("menuBar"); // NOI18N 

    org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(graphics.GraphicsApp.class).getContext().getResourceMap(GraphicsView.class); 
    fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N 
    fileMenu.setName("fileMenu"); // NOI18N 

    javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(graphics.GraphicsApp.class).getContext().getActionMap(GraphicsView.class, this); 
    exitMenuItem.setAction(actionMap.get("quit")); // NOI18N 
    exitMenuItem.setName("exitMenuItem"); // NOI18N 
    fileMenu.add(exitMenuItem); 

    menuBar.add(fileMenu); 

    helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N 
    helpMenu.setName("helpMenu"); // NOI18N 

    aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N 
    aboutMenuItem.setName("aboutMenuItem"); // NOI18N 
    helpMenu.add(aboutMenuItem); 

    menuBar.add(helpMenu); 

    statusPanel.setName("statusPanel"); // NOI18N 

    statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N 

    statusMessageLabel.setName("statusMessageLabel"); // NOI18N 

    statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); 
    statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N 

    progressBar.setName("progressBar"); // NOI18N 

    javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel); 
    statusPanel.setLayout(statusPanelLayout); 
    statusPanelLayout.setHorizontalGroup(
     statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) 
     .addGroup(statusPanelLayout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(statusMessageLabel) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 230, Short.MAX_VALUE) 
      .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(statusAnimationLabel) 
      .addContainerGap()) 
    ); 
    statusPanelLayout.setVerticalGroup(
     statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(statusPanelLayout.createSequentialGroup() 
      .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
      .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(statusMessageLabel) 
       .addComponent(statusAnimationLabel) 
       .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
      .addGap(3, 3, 3)) 
    ); 

    setComponent(mainPanel); 
    setMenuBar(menuBar); 
    setStatusBar(statusPanel); 
}// </editor-fold> 

// Variables declaration - do not modify 
private javax.swing.JPanel jPanel1; 
private javax.swing.JPanel mainPanel; 
private javax.swing.JMenuBar menuBar; 
private javax.swing.JProgressBar progressBar; 
private javax.swing.JLabel statusAnimationLabel; 
private javax.swing.JLabel statusMessageLabel; 
private javax.swing.JPanel statusPanel; 
// End of variables declaration 

private final Timer messageTimer; 
private final Timer busyIconTimer; 
private final Icon idleIcon; 
private final Icon[] busyIcons = new Icon[15]; 
private int busyIconIndex = 0; 

private JDialog aboutBox; 
} 

: 다음은 클래스의 세 가지에 대한 코드 (대부분 자동 생성)입니다 마지막 클래스는 그래픽 자체입니다 :

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package graphics; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.Line2D; 
import javax.swing.JPanel; 

public class Graph extends JPanel{ 

int[] data = { 
    21, 14, 18, 03, 86, 88, 74, 87, 54, 77, 
    61, 55, 48, 60, 49, 36, 38, 27, 20, 18 
}; 
final int PAD = 20; 

protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D)g; 
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
         RenderingHints.VALUE_ANTIALIAS_ON); 
    int w = getWidth(); 
    int h = getHeight(); 
    // Draw ordinate. 
    g2.draw(new Line2D.Double(PAD, PAD, PAD, h-PAD)); 
    // Draw abcissa. 
    g2.draw(new Line2D.Double(PAD, h-PAD, w-PAD, h-PAD)); 
    double xInc = (double)(w - 2*PAD)/(data.length-1); 
    double scale = (double)(h - 2*PAD)/getMax(); 
    // Mark data points. 
    g2.setPaint(Color.red); 
    for(int i = 0; i < data.length; i++) { 
     double x = PAD + i*xInc; 
     double y = h - PAD - scale*data[i]; 
     g2.fill(new Ellipse2D.Double(x-2, y-2, 4, 4)); 
    } 
} 

private int getMax() { 
    int max = -Integer.MAX_VALUE; 
    for(int i = 0; i < data.length; i++) { 
     if(data[i] > max) 
      max = data[i]; 
    } 
    return max; 
} 
} 

몇 가지 질문이 있습니다 :
(a) jPanel1에 그래프를 표시하는 방법은 무엇입니까?
(b) 초기화 그래픽 구성 요소의 우수 사례는 무엇입니까? 그래프()를 호출하는 가장 좋은 장소는 어디입니까?
(c) 다른 응용 프로그램의 경우 jfreechart를 사용하여 그래프를 그린 다음 .jpeg 파일로 덤프합니다. jfreechart를 사용하여 그래프를 만들고 pagel에 직접 표시 할 수 있습니까?

미리 감사드립니다.

답변

3

일부 답변 :

(A) jPanel1이 레이아웃 매니저에 대한가 BorderLayout을 사용하고 BorderLayout.CENTER 위치에 jPanel1에 그래프 JPanel을 추가 되세요.
(b) 여기서 묻고있는 것이 명확하지 않습니다. 필요에 따라 개체를 만듭니다.
(c) 예. JFreeChart의 그래프 구성 요소는 Swing 구성 요소를 확장합니다. JPanel (JComponent 또는 JComponent)을 믿기 때문에 구성 요소로서 GUI에 직접 추가 할 수 있어야합니다 (키가되는 한) 컨테이너, 컨테이너, 즉, 차트를 보유하고있는 사람은 올바른 레이아웃 관리자를 사용합니다. 아직 그렇게하지 않았다면 "Container에 컴포넌트 배치하기"에 대한 스윙 튜토리얼을 읽어야한다. 왜냐하면 정보가 성공하기위한 열쇠이기 때문이다.

마지막으로 NetBeans 코드 생성을 도용하여 손으로 스윙 코드를 만드는 것이 좋습니다. 스윙을 배우는 가장 좋은 방법입니다.

행운!

+0

도움과 조언을 해주셔서 감사합니다. jPanel1.setLayout (new BorderLayout()); 기적을 일으켰다! –

+0

대단히 환영합니다. 아직 시작하지 않았다면 여기에서 시작하는 레이아웃 자습서를 읽어 보시기 바랍니다. http://download.oracle.com/javase/tutorial/uiswing/layout/ –

+0

감사합니다! 그것은 단지 프로젝트를 마무리 짓는 것입니다. GUI는 개념적으로 가장 시간이 많이 걸리는 가장 쉬운 부분이었습니다. 나는 확실히 더 많은 시간을 낭비하지 않는 스윙을 배울 필요가있다. :) –