2010-04-16 4 views
7

miglayout을 사용하여 JTextFields (짧은 입력 응답) 및 JTextAreas (긴 응답)가있는 양식을 작성합니다. 문제는 두 가지입니다.스윙 - JTextField와 JTextAreas를 혼합하고 동일한 시각적 모양을 갖는 방법?

  1. 스크롤 패널 둘러싼 텍스트 영역 주위에 배치 된 테두리가 텍스트 필드의 테두리와 일치하지 않습니다.
  2. 텍스트 영역/텍스트 필드의 너비와 위치가 달라서 제대로 정렬되지 않습니다. alt text http://grab.by/3RMk 당신은 경계가 줄 것을 볼 수 있습니다,하지만 여전히 격차가 있음 : 오른쪽으로 왼쪽/오른쪽에서 변경 한 후

    alt text http://grab.by/3O0V

는/입력합니다. 내가 novisualpadding 설정했지만이 문제가 해결되지 않았다.

소스 코드 :

package test2; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import net.miginfocom.swing.MigLayout; 

public class Test extends JPanel { 

private static final int NUM_CHARACTERS_WIDTH = 20; 
private static final int NUM_ROWS = 5; 
public Test() { 

    setLayout(new MigLayout(
      "wrap 2", 
      // Align text labels on the so their right edge meets left edge of the text fields 
      "[right][left]" 
      )); 

    add(new JLabel("Text field:")); 
    add(new JTextField(NUM_CHARACTERS_WIDTH)); 

    add(new JLabel("No scrollpane text area:")); 
    add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)); 

    add(new JLabel("Scrollpane text area:")); 
    add(new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH))); 

    add(new JLabel("Text field:")); 
    add(new JTextField(NUM_CHARACTERS_WIDTH)); 

} 


public static void main(String[] args) { 
    JFrame frame = new JFrame(""); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel panel = new Test(); 
    frame.add(panel); 
    frame.pack(); 
    frame.setVisible(true); 
} 

}

여전히 시각적 조화를 유지하면서 원하는 혼합하는 방법과 일치 JTextField를하고 jtextareas은 무엇입니까? 텍스트 영역과는 대조적으로 텍스트 영역에 초점이있을 때 텍스트 필드에 파란색 강조 표시가 나타납니다. 시각적 불연속의 또 다른 원인입니다.

답변

0

대답은 MiG 레이아웃 사람들이 working on a fix for their next version입니다.

안녕하세요

,

애플은 개발자가 결정하도록 기본적으로 보상하지의 심한 habbit 있습니다. 이것은 OS X처럼 시각적으로 보이도록 테두리를 추가 한 경우입니다. 이것은 레이아웃 관리자의 선택이어야합니다 ...

MigLayout은 이와 같은 시각적 경계를 보완 할 수 있지만 Windows XP의 JTabbedPane입니다. 하지만 OS X에서 100 % 훌륭하게 수행 할 수 있는지는 잘 모르겠습니다. 확인해야 겠어. 우리는 텍스트 필드가 경계선 안으로 들어가는 것을 원하지 않습니다.

나는 todo 목록에 다음 버전을 추가했습니다. TextField 주변의 일처럼 TextArea에 테두리를 제공해야

(myTextArea).setBorder(new TextField().getBorder()); 

:

3

테두리 문제를 어떻게 해결할 수 있는지 잘 모르지만 레이아웃 상황을 해결하려면 springlayout을 사용하면됩니다. Springlayout은 JPanel 내에서 요소를 더 잘 배치하는 방법 일뿐입니다. 그것에 대해 자세히 알 수 있습니다 Java Sun Tutorial

특히 각 요소의 북쪽, 남쪽, 서쪽 및 동쪽 경계선을 설정하여 사용합니다. 이렇게하려면 먼저 레이블 호출을 추가에서 가져와 각 요소의 이름을 지정할 수 있어야합니다. 그래서 대신 :

add(new JLabel("Text field:")); 

해야 할 것 : 당신의 요소 (JLabels, JTextAreas 및 JTextField를) 각각에 대해

JLabel myLabelName = new JLabel("Text field:"); 
add(myLabelName); 

. 이 작업이 완료되면 레이아웃을 쉽게 설정할 수 있습니다.

Springlayout layout = new SpringLayout(); 
setLayout(layout); 

그런 다음 각 요소에 대해 원하는 테두리를 설정해야합니다. 그들은 남쪽, 북쪽, 서쪽 그리고 동쪽의 특정 순서에 있어야합니다. 네가 원하지 않는다면 네 국경을 모두 사용할 필요는 없지만. 다음은 첫 번째 텍스트 영역을 설정하는 방법에 대한 예입니다.

layout.putConstraint(SpringLayout.NORTH, FirstTextAreaName, 10, SpringLayout.NORTH, this); 
layout.putConstraint(SpringLayout.WEST, FirstTextAreaName, this.getWidth()/2, SpringLayout.WEST, this); 
layout.putConstraint(SpringLayout.EAST, FirstTextAreaName, -10, SpringLayout.EAST, this); 

이 예는 텍스트 영역의 남쪽을 설정하지 않습니다하지만 당신이 원하는 않은 경우 먼저해야합니다. 첫 번째 줄은 텍스트 영역의 북쪽을 위쪽에서 10 픽셀 떨어진 위치에 설정합니다. 다른 부분에게 다음을 설정할 때 이전 위 영역 대신 이름하고 10 개 픽셀 거리 이전의 남쪽에서 말하는 :

layout.putConstraint(SpringLayout.NORTH, SecondTextAreaName, 10, SpringLayout.SOUTH, FirstTextAreaName); 

상기 예에서 두 번째 행은 동쪽으로 설정 텍스트 영역을 메인 패널의 중간에서 시작합니다. 마지막 세 번째 줄은 텍스트 영역의 동쪽을 메인 패널의 동쪽에서 10 픽셀로 설정합니다.

2

레이아웃 문제가있는 경우 [right][left] 대신 의 columnConstraints 값을 사용해보십시오.

다른 문제의 경우보기와 느낌이 일치하지 않는 것 같습니다. Windows에서 코드를 실행했는데 그 차이점도 있지만 덜 위험합니다. 내 제안은 텍스트 필드와 텍스트 영역에 대해 명시 적 경계를 명시 적으로 설정하는 것입니다.

setLayout(new MigLayout(
     "wrap 2", 
     "[right][fill]" 
     )); 

JTextField textField; 
JScrollPane scrollPane; 

add(new JLabel("Text field:")); 
textField = new JTextField(NUM_CHARACTERS_WIDTH); 
textField.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); 
add(textField); 

add(new JLabel("No scrollpane text area:")); 
add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)); 

add(new JLabel("Scrollpane text area:")); 
scrollPane = new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)); 
scrollPane.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); 
add(scrollPane); 

add(new JLabel("Text field:")); 
textField = new JTextField(NUM_CHARACTERS_WIDTH); 
textField.setBorder(new EtchedBorder(EtchedBorder.LOWERED)); 
add(textField); 

Identicial borders http://img412.imageshack.us/img412/6341/clipboard01jl.png

사용을 고려, java.awt.GridBagLayout의 컴포넌트를 정렬 MigLayout을 얻을 수없는 경우

import static java.awt.GridBagConstraints.*; 

setLayout(new GridBagLayout()); 

GridBagConstraints leftCons = new GridBagConstraints(); 
leftCons.anchor = NORTHEAST; 
leftCons.fill = NONE; 
leftCons.weightx = 1.0; 
leftCons.gridy = RELATIVE; 
leftCons.gridx = 0; 
leftCons.insets = new Insets(4, 8, 4, 8); 

GridBagConstraints rightCons = new GridBagConstraints(); 
rightCons.anchor = NORTHWEST; 
rightCons.fill = HORIZONTAL; 
rightCons.weightx = 1.0; 
rightCons.gridy = RELATIVE; 
rightCons.gridx = 1; 
rightCons.insets = leftCons.insets; 

add(new JLabel("Text field:"), leftCons); 
add(new JTextField(NUM_CHARACTERS_WIDTH), rightCons); 

add(new JLabel("No scrollpane text area:"), leftCons); 
add(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH), rightCons); 

add(new JLabel("Scrollpane text area:"), leftCons); 
add(new JScrollPane(new JTextArea(NUM_ROWS, NUM_CHARACTERS_WIDTH)), rightCons); 

add(new JLabel("Text field:"), leftCons); 
add(new JTextField(NUM_CHARACTERS_WIDTH), rightCons); 
+0

[채우기]가 도움이됩니다. 그러나 크기는 여전히 Mac OSX에서 완벽하지 않습니다. http://grab.by/3O9U – I82Much

+1

아마도 더 적합한 대안은 한 구성 요소 유형의 기본 설정 테두리를 채택하여 다른 구성 요소 유형에 적용하는 것일 수 있습니다. 예 : textField.setBorder (scrollPane.getBorder()). –

+0

java.awt.GridBagLayout에 시도해보기. 자세한 내용은 수정 된 답변을 참조하십시오. –

2

내가 알고 MiGLAyout (내가 좋아하는, BTW) 엄격한 픽셀 정렬 대 시각적 정렬을위한 특별한 처리를 수행 할 수 있습니다. 당신은 이것으로 달릴 수도 있습니다 ... '알'단위 식별자가이 용도로 사용되었지만 사용하지 않아도 예제를 제공 할 수 없습니다. 아마도 MiG 샘플 프로젝트를 다운로드하고 동일한 정렬 문제가 있는지 확인할 수 있습니다. (필자와 비슷한 패널이있을 것입니다.)

우리는 텍스트 패널과 텍스트 패널을 같은 패널에 아주 자주 섞어서 실행하지 않습니다. 우리는 과 동일하게 설정해야합니다. Noel Ang에 의해 제안 된 텍스트 필드의 경계. 그 차이가 아닌지 확실하지 스크린 샷을 위해 ... +1을

0

첫째을 - 우리는 각각의 구성 요소를 추가로

또한, 대신 레이아웃 생성자에서 제약 조건을 지정, 우리는 일반적으로 그것들을 지정합니다. Mac을 사용하고 있으므로 Quaqua Look and Feel을 사용해 보셨습니까? 텍스트 상자/영역을 올바르게 렌더링합니다.

4

이 질문은 꽤 오래지만, TextAreaTextField의 일치하는 국경을 얻을 알고 .

+0

좋은 하나! 그러나 "new JTextField(). getBorder()"여야합니다. –