2014-06-24 3 views
0

이미지 처리 소프트웨어 (재미 있기만 한)를 개발 중이며 이미지 크기 조정 옵션이 있습니다. 기본적으로 두 개의 JTextArea 구성 요소가있는 창이 열리고 크기 조정을 위해 원하는 이미지 너비와 높이가 표시됩니다. 사용자가 원하는 경우 화면 비율을 유지하기 위해 JCheckBox도 있습니다. 문제는. 확인란을 선택하면 사용자가 너비 또는 높이를 먼저 입력합니다. 다른 텍스트 영역이 AR을 유지할 수 있도록 변경 될 때마다 자동으로 업데이트되기를 원합니다. 이 문제를 다루는 몇 가지 코드를 개발했지만 실제로 청취자가 어떤 구성 요소에 할당해야하는지 이해하지 못하기 때문에 실제로 원하는 것을 제공하지 않습니다.두 개의 JTextArea에 대한 이벤트 리스너 설정

코드 :

String height, width; 
    if (checkBoxImage.isSelected()){ 
     // aspect ratio = width/height 
     width = widthArea.getText(); 
     height = heightArea.getText(); 
     double aspectRatio = (double) images.get(tabbedPane.getSelectedIndex()).getWidth()/images.get(tabbedPane.getSelectedIndex()).getHeight(); 
     /** 
     * to do, update width, height area 
     * to the closest user input 
     */ 
     if(heightArea.getText().length() != 0 && heightArea.getText().length() <= 5 
       && heightArea.getText().charAt(0) != '0'){ 
      //parsing string to integer 
      try{ 
       int heightNum = Integer.parseInt(height); 
       int widthNum = (int) Math.round(aspectRatio * heightNum); 
       widthArea.setText(String.valueOf(widthNum)); 
       widthArea.updateUI(); 
       frameimgSize.repaint(); 
      } 
      catch(NumberFormatException e1){JOptionPane.showMessageDialog(error,e1.getMessage(),"Error", JOptionPane.ERROR_MESSAGE);} 
     } 
     //width has been entered first 
     else if(widthArea.getText().length() != 0 && widthArea.getText().length() <= 5 && 
       widthArea.getText().charAt(0) != '0'){ 
      try{ 
       int widthNum = Integer.parseInt(width); 
       int heightNum = (int) Math.round(aspectRatio * widthNum); 
       heightArea.setText(String.valueOf(heightNum)); 
       heightArea.updateUI(); 
       frameimgSize.repaint(); 
      } 
      catch(NumberFormatException e1){JOptionPane.showMessageDialog(error,e1.getMessage(),"Error", JOptionPane.ERROR_MESSAGE);} 
     } 
    } 
+3

문제가있는 코드를 오프 사이트에 연결하는 대신 질문 자체에 게시하십시오. jTextAreas의 텍스트를 설정하거나 이벤트 리스너를 연결하거나 값 또는 다른 것의 계산에 문제가 있습니까? –

+0

내 주요 문제는 정확히 내가 이벤트 리스너를 첨부해야합니다 무엇입니까? JTextArea에요? CheckBox 구성 요소에? 사용자가 너비 또는 높이 값을 변경할 때마다 텍스트를 업데이트 할 수 있으려면 JTextArea?는 실제로 코드 관련 문제가 아닙니다. –

답변

3

너비와 높이 필드에 숫자가 아닌 값이 있습니까?

그렇지 않은 경우 JTextFields 대신 JSpinners 또는 JFormattedTextFields을 사용하십시오. 그렇다면 (예를 들어 너비와 높이뿐만 아니라 "단위"도 입력 할 수 있음) 예를 들어 DocumentListener을 JTextFields에 연결하여 기본 텍스트 문서의 내용에 대한 변경 사항을 모니터링해야합니다. 다음은 그 예입니다.

그러면 비슷한 DocumentListener를 heightTextField에 추가 할 수 있습니다.

JTextFields를 사용하는 경우 해당 내용을 구문 분석하고 단위 (해당되는 경우)를 읽고 유효하지 않은 숫자 값을 입력 한 경우 NumberFormatExceptions를 처리해야합니다.

은 핸들러를 추가하는 위치에 대한 질문 ...

높이 GUI 요소에 문서의 변경이있을 때 의 업데이트가 발생해야 대답합니다. 마찬가지로 높이의 업데이트는 너비 GUI 요소로 문서가 변경 될 때 발생합니다.

0으로 나누기 오류를 적절하게 처리하거나 입력을 항상 0보다 크게 제한해야하며 복식을 사용하여 계산을 수행하고 Math.round()을 사용하여 측면 유지를위한 최상의 정수 값을 얻는 것이 좋습니다.

예 :

int calculateHeight(int width, double aspect) { 

    if(aspect <= 0.0) { 
     // handle this error condition 
    } 
    return (int)Math.round(width/aspect); 
} 

실제로 종횡비를 추적, I는 멤버 변수에 저장 것이고 ... JCheckBox에에 ActionListener 추가 인해 모든 값 변경의 대상 종횡비를 업데이트 폭 및 높이 필드는 정수 반올림으로 인해 종횡비가 "크리핑"될 수 있습니다. 여기

때마다 가로 세로 비율 체크 상태 변경 당신의 측면을 추적에 대한 예입니다 :

private double aspect = 1.0; 

aspectCheckBox.addActionListener(new java.awt.event.ActionListener() { 
    public void actionPerformed(java.awt.event.ActionEvent evt) { 
     preserveAspectActionPerformed(evt); 
    } 
});  

private void preserveAspectActionPerformed(java.awt.event.ActionEvent evt) {           

    try { 
     double w = Double.parseDouble(widthField.getText()); 
     double h = Double.parseDouble(heightField.getText()); 
     aspect = w/h;    
    } 
    catch(NumberFormatException ex) { 
     // ... error occurred due to non-numeric input 
     // (use a JSpinner or JFormattedTextField to avoid this) 
    } 
} 

가장 중요한 것은 작업의 잘못된 입력 타입을 사용하지 않도록하는 것입니다

희망이 도움이됩니다.

3

첫째, 내가 JTextArea를 사용하지 것이다, 그것은 자유 형식 텍스트 편집 (메모장을 생각)에 대한 의미입니다. 대신 최소한 JTextField을 사용해야하지만 실제로는 JSpinner을 사용해도 좋습니다.

자세한 내용은 How to Use Text Fields을 참조하십시오.

기본적으로 JTextField의 경우 ActionListener 및/또는 FocusListener을 사용하여 필드의 변경 사항을 모니터링 할 수 있습니다.

이 청취자는 사실 이후, 즉 사용자가 필드 편집을 마친 후에 만 ​​통지받는 경향이 있습니다. 실시간 피드백을 원할 경우 실시간으로 필드의 기본 Document이 수정 될 때마다 알려주는 DocumentListener을 사용할 수 있습니다.

JSpinner은 편집기와 컨트롤이 포함 된 구성 요소이므로 좀 더 복잡합니다. ChangeListener을 사용할 수 있습니다. 이는 필드 모델에 대한 변경이 커밋 될 때 알 수 있습니다. 이것은 앞서 언급 한 ActionListenerFocusListener 대신에 발생하므로 단일 수신기 만 있으면되지만 실시간 피드백은 제공되지 않습니다. (적어도 더 많은 작업이 필요하지는 않습니다.)

+0

감사합니다. 제안 사항입니다. 나는 그것들 중 하나를 시도해 그것이 어떻게되는지보아야한다. –